我的访问和刷新令牌系统似乎毫无意义(Node.JS)

问题描述 投票:0回答:1

当用户通过 Web 浏览器的 ajax 请求登录到 Node.js Web 服务器时,我正在尝试实现访问和刷新令牌。

我有它,所以当他们登录时,它会创建一个新的访问和刷新令牌并将其保存到用户的 cookie,访问令牌将在 1 小时内过期,刷新令牌将在 30 天后过期。

然后,当用户执行某些操作时,例如查看索引页面(获取)或想要更新其个人资料(发布),Cookie 中的令牌就会得到身份验证:

  • 如果访问令牌无效,它将查找刷新令牌
  • 如果访问令牌有效,则继续请求
  • 如果刷新令牌无效,则会将用户发送回登录页面
  • 如果刷新令牌有效,它将生成新的访问令牌和新的刷新令牌并继续请求

我的令牌验证中间件:

    exports.verifyAccessToken = (redirect) => (req, res, next) => {
        const accessToken = req.cookies.accessToken;
        const refreshToken = req.cookies.refreshToken;
        log.debug("verifying, cookies:", req.cookies);

        if (!accessToken) {
            return redirect ? res.redirect("/login") : res.status(401).json({ message: 'Verification Error: Access Token missing' });
        }

        jwt.verify(accessToken, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => {
            if (err) {
                if (!refreshToken) {
                    return redirect ? res.redirect("/login") : res.status(400).json({ message: 'Verification Error: Access Token invalid/expired, Refresh Token missing' });
                }

                jwt.verify(refreshToken, process.env.REFRESH_TOKEN_SECRET, (err, decoded) => {
                    if (err) {
                        return redirect ? res.redirect("/login") : res.status(403).json({ message: 'Verification Error: Refresh Token invalid/expired' });
                    }
                    
                    helper.setNewAccessToken(res, decoded.email);
                    helper.setNewRefreshToken(res, decoded.email);
                    req.user = decoded;
                    next();
                });
            } else {
                req.user = decoded;
                next();
            }
        });
    };
    

这是处理访问/刷新令牌的有效方法吗?我只是不明白刷新令牌是否被盗还有什么意义,整个事情都是多余的。

我是否应该将刷新令牌存储在其他地方,或者应该将其与访问令牌一起存储在 cookie 中?

实现这一点的正确方法是什么?我希望用户不必每小时不断地重新登录,同时确保一切都是安全的。

node.js express jwt access-token refresh-token
1个回答
0
投票

您的流程不正确,因为您不应同时发送访问令牌和刷新令牌。事实上,您应该为身份验证流程(使用访问令牌)和刷新流程(使用刷新令牌)拥有不同的端点。

在客户端,存储令牌的一种方法是在 cookie 中,但访问令牌和刷新令牌应尽可能分开。您可以对不同的端点使用 httpOnly 安全 cookie,这样令牌就不会被暴露。例如,刷新令牌只能在刷新端点使用 SSL 进行访问,并且理想情况下不应通过客户端的 JavaScript 进行访问,以减少攻击面。

© www.soinside.com 2019 - 2024. All rights reserved.