使用 Passport 使用访问和刷新令牌进行节点身份验证

时间:2021-03-15 00:58:15

标签: node.js security jwt passport.js access-token

我已经使用 jwt 策略实现了 Passportjs 身份验证系统。

我想添加一个刷新令牌,以便我可以缩短令牌的有效期并允许用户注销/服务器撤销令牌。

通过对其他问题的一些挖掘,我认为流程应该是这样的:

流程:

  1. 用户点击 xarray 路由并返回访问令牌和设置为 httpOnly cookie 的刷新令牌。该 cookie 还与相关用户 ID 一起存储在服务器上的 db 表中
  2. 返回的jwt token存储在前端本地存储
  3. 经过 15 分钟后,jwt 令牌过期,任何对受保护路由的调用都会导致 401 响应。然后前端使用 httpOnly cookie 调用 /login
  4. 根据数据库检查 cookie 中包含的刷新令牌,如果有效,则返回新的访问令牌并设置新的刷新令牌 cookie

我的问题是 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);
        }
    })();
};

谢谢!

0 个答案:

没有答案