如何在 express 上使用 passport-jwt 策略来保护 post 路由
How to use passport-jwt strategy on express to protect post route
我在我的应用程序上使用 passportJs 对用户进行身份验证,我可以创建用户,为他们创建凭据,他们可以毫无问题地登录。对于受保护的路线,我正在使用 passport-jwt 策略,并且所有路线都可以正常工作。但是,我一直在尝试对创建这些用户的路由使用相同的通行证策略,但无论我做什么,我总是得到未经授权的响应 401。在前端,我使用 react 和 axios。
这是我的护照代码:
const opts = {
jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme("JWT"),
secretOrKey: process.env.JWT_SECRET
};
passport.use(
"jwtToPostUser",
new JWTstrategy(opts, (jwt_payload, done) => {
try {
User.findOne({
where: {
email: jwt_payload.email
}
}).then(user => {
if (user) {
console.log("user found in db in passport");
done(null, user);
} else {
console.log("user not found in db");
done(null, false);
}
});
} catch (err) {
done(err);
}
})
);
创建用户的路径如下:
router.post(
"/signup",
passport.authenticate("jwtToPostUser", { session: false }),
(req, res, next) => {
console.log(req.body);
const {
businessname,
username,
firstName,
lastName,
phoneNumber,
email,
password,
customerStatus,
userType,
Gooduntil
} = req.body;
if (password.length < 8) {
throw "Password must be at least 8 characters";
} else {
User.findOne({
where: {
email
}
}).then(user => {
if (user) {
res.send("Email already exists!");
} else {
const encryptedPassword = bcrypt.hashSync(password, salt);
let newUser = {
businessname,
username,
firstName,
lastName,
phoneNumber,
email,
password: encryptedPassword,
customerStatus,
userType,
Gooduntil
};
User.create(newUser)
.then(() => {
// newUser.isAdmin = true
delete newUser.password;
res.send(newUser);
})
.catch(function(err) {
console.log(err);
res.json(err);
});
}
});
}
}
);
此 JWT 策略适用于所有获取路由,但创建用户的这条路由除外。
这是我对前端的要求:
addClient = async e => {
let newUser = {
businessname: businessname.toLowerCase(),
firstName: firstName.toLowerCase(),
lastName: lastName.toLowerCase(),
email,
username,
password,
phoneNumber,
customerStatus: customerStatus.value,
userType,
Gooduntil
};
const accessString = localStorage.getItem("JWT");
await Axios.post(
"/auth/signup",
{
headers: {
Authorization: `JWT ${accessString}`
}
},
newUser
)
.then(res => {
console.log(res);
this.setState({
loadingAxiosReq: false
});
})
.catch(err => console.log(err));
}
这是我收到的错误:错误:请求失败,状态代码为 401
有人知道为什么会这样吗?我能让它工作的唯一方法是从注册路径中删除 passport-JWT 策略,但这并不安全。请帮忙!
您确定在您的 POST 请求中附加了您的身份验证令牌吗?
我将 header 设置为授权,我将其替换为 jwt,现在可以完美运行了。
我在我的应用程序上使用 passportJs 对用户进行身份验证,我可以创建用户,为他们创建凭据,他们可以毫无问题地登录。对于受保护的路线,我正在使用 passport-jwt 策略,并且所有路线都可以正常工作。但是,我一直在尝试对创建这些用户的路由使用相同的通行证策略,但无论我做什么,我总是得到未经授权的响应 401。在前端,我使用 react 和 axios。 这是我的护照代码:
const opts = {
jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme("JWT"),
secretOrKey: process.env.JWT_SECRET
};
passport.use(
"jwtToPostUser",
new JWTstrategy(opts, (jwt_payload, done) => {
try {
User.findOne({
where: {
email: jwt_payload.email
}
}).then(user => {
if (user) {
console.log("user found in db in passport");
done(null, user);
} else {
console.log("user not found in db");
done(null, false);
}
});
} catch (err) {
done(err);
}
})
);
创建用户的路径如下:
router.post(
"/signup",
passport.authenticate("jwtToPostUser", { session: false }),
(req, res, next) => {
console.log(req.body);
const {
businessname,
username,
firstName,
lastName,
phoneNumber,
email,
password,
customerStatus,
userType,
Gooduntil
} = req.body;
if (password.length < 8) {
throw "Password must be at least 8 characters";
} else {
User.findOne({
where: {
email
}
}).then(user => {
if (user) {
res.send("Email already exists!");
} else {
const encryptedPassword = bcrypt.hashSync(password, salt);
let newUser = {
businessname,
username,
firstName,
lastName,
phoneNumber,
email,
password: encryptedPassword,
customerStatus,
userType,
Gooduntil
};
User.create(newUser)
.then(() => {
// newUser.isAdmin = true
delete newUser.password;
res.send(newUser);
})
.catch(function(err) {
console.log(err);
res.json(err);
});
}
});
}
}
);
此 JWT 策略适用于所有获取路由,但创建用户的这条路由除外。
这是我对前端的要求:
addClient = async e => {
let newUser = {
businessname: businessname.toLowerCase(),
firstName: firstName.toLowerCase(),
lastName: lastName.toLowerCase(),
email,
username,
password,
phoneNumber,
customerStatus: customerStatus.value,
userType,
Gooduntil
};
const accessString = localStorage.getItem("JWT");
await Axios.post(
"/auth/signup",
{
headers: {
Authorization: `JWT ${accessString}`
}
},
newUser
)
.then(res => {
console.log(res);
this.setState({
loadingAxiosReq: false
});
})
.catch(err => console.log(err));
}
这是我收到的错误:错误:请求失败,状态代码为 401
有人知道为什么会这样吗?我能让它工作的唯一方法是从注册路径中删除 passport-JWT 策略,但这并不安全。请帮忙!
您确定在您的 POST 请求中附加了您的身份验证令牌吗?
我将 header 设置为授权,我将其替换为 jwt,现在可以完美运行了。