我已经使用 jwt 策略实现了 Passportjs 身份验证系统。
我想添加一个刷新令牌,以便我可以缩短令牌的有效期并允许用户注销/服务器撤销令牌。
通过对其他问题的一些挖掘,我认为流程应该是这样的:
流程:
xarray
路由并返回访问令牌和设置为 httpOnly cookie 的刷新令牌。该 cookie 还与相关用户 ID 一起存储在服务器上的 db 表中/login
我的问题是 Passport 使用 /refresh
处理受保护路由中 jwt 的验证。我不确定如何使用通行证来检查刷新令牌,这需要不同的配置(例如,从 cookie 而不是 authHeader 中提取 jwtFromRequest 值的配置)
有没有人有这方面的经验,或者有什么建议?否则我可能会完全放弃 Passport,因为我看不到有人尝试类似的
代码:
受保护的路由:
passport.authenticate('jwt', {session: false})
登录方式:
router.get('/test', passport.authenticate('jwt', { session: false }), (req, res, next) => {
res.status(200).json({ success: true, message: 'success!' });
});
护照配置:
exports.login = (req, res, next) => {
(async() => {
try {
const user = await User.findOne({ where: {email: req.body.email} });
if(!user) {
return res.status(401).json({ success: false, message: "Bad Username/Password" });
}
const isValid = await bcrypt.compare(req.body.password, user.hashedPassword);
if(isValid) {
const tokenObject = utils.issueJWT(user);
return res.status(200).json({ success: true, token: tokenObject.token, expiresIn: tokenObject.expires});
} else {
return res.status(401).json({ success: false, message: "Bad Username/Password" });
}
} catch(err) {
next(err);
}
})();
};
谢谢!