Я пытаюсь понять процесс аутентификации при входе пользователя в приложение 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();
}
});
}
Я что-то пропустил? Что-то не так с этим? Каковы преимущества / недостатки использования jwt
с или без passport
?