【发布时间】:2020-04-23 14:36:36
【问题描述】:
我正在尝试了解我正在构建的 MERN 应用的用户登录身份验证过程。我看到很多教程同时使用passport 和jwt,我很难理解为什么我会同时使用两者而不是只使用其中一个。我的偏好是使用jwt,但如果有理由不使用,我将使用passport,或两者兼而有之。
例如,这是一个/login 路由,它向用户返回一个jwt:
app.post('/login', (req, res, next) => {
let query = { email: req.body.email };
let entered_password = req.body.password;
User.findOne(query, (err, user) => {
if (err) { console.log(err); }
if (!user) {
return res.json({ message: "Invalid authorization" });
}
// returned from user object stored in mongodb
let bcrypted_password = user.password;
// put password entered on login page through bcrypt and compare it to the hashed password
bcrypt.compare(entered_password, bcrypted_password, (error, isMatch) => {
if (error) { console.log(error); }
else {
if (isMatch) {
// passwords match, so create a jwt token for user
jwt.sign({ email: req.user.email },
process.env.JWT_KEY,
{ expiresIn: "24h" },
(jwt_err, token) => {
if (jwt_err) {
return res.sendStatus(402);
}
else {
// token created, now return it to user
return res.json({ token });
}
});
}
else { // passwords do not match
return res.json({ message: "Invalid authorization" });
}
}
});
});
});
这个jwt 被返回给用户并存储在localStorage 中。然后当用户尝试访问受保护的路由时,我发送令牌并使用verifyToken 中间件来检查令牌是否有效:
const verifyToken = (req, res, next) => {
let token = req.body.token;
jwt.verify(token, process.env.JWT_KEY, (err, authData) => {
if(err) {
res.json({ message: "Authentication failed" });
}
else {
// verification worked
next();
}
});
}
我错过了什么吗?这有什么问题吗?在有或没有passport 的情况下使用jwt 的优点/缺点是什么?
【问题讨论】:
标签: node.js express jwt passport.js