javascript - JWT 刷新 token 策略

标签 javascript reactjs jwt access-token refresh-token

我在一篇博客 (here) 中看到关于使用 JWT 在 React 中进行身份验证的设置:访问 token 有效期为 15 分钟,刷新 token 有效期为 1 个月;客户每 10 分钟调用一次 /refreshToken端点,检查 refreshToken 是否仍然有效(否则将显示用户登录屏幕)。
在服务器上,/refreshToken端点正确检查 refreshtoken 没有过期,在 refreshtoken 有效负载中具有 id 的用户仍然存在且有效(即:传递的 refreshToken 存在于他的 refreshTokens 数组中)。如果一切正常,就会生成一个新的访问 token ,并与响应一起发回。
到目前为止,一切都很好。 但是 ,在返回响应之前,也会生成一个新的 refreshToken,并将旧的替换为用户的 refreshTokens 数组...我认为这种策略是有缺陷的,因为这样用户将 从不看到他的登录过期,即使在刷新 token (本例中为一个月)之后也会过期......
我确实做了一些测试(将 1 个月的值降低到 30 分钟),并且有效地用户授权永不过期......强制用户注销删除他的 refreshTokens 数组显然工作正常,但我希望在刷新时注销 token 按年龄过期。
我问我的理解是否正确(服务器上的 refreshToken 端点不应该刷新刷新 token ,而应该只刷新访问 token ),或者我是否遗漏了什么。
更新 在@Ghero 评论之后:
我明白你的意思......但是如果不更新它的到期,为什么要刷新它?
但是,用于更新刷新 token 的博客代码:

    const jwt = require("jsonwebtoken");

    exports.getRefreshToken = (user) => {
      const refreshToken = jwt.sign(user, process.env.REFRESH_TOKEN_SECRET, {
        expiresIn: eval(process.env.REFRESH_TOKEN_EXPIRY),
      });
      return refreshToken;
    };

    // REFRESH_TOKEN_EXPIRY is set to 30 days
看起来它总是将到期日期推迟 30 天。这样它就永远不会过期...

最佳答案

在每次使用时替换刷新 token 是当前的最佳实践。
拥有一次性使用刷新 token 意味着如果刷新 token 被盗并且多次使用(被您和黑客), token 服务可以检测到并自动注销用户,保护用户免受攻击。
刷新 token 有一个最长有效时间,例如 30 天,但这通常也是您可以配置的。根据您使用的服务,有不同的刷新 token 生命周期策略。下图展示了 IdentityServer 如何处理刷新 token :
enter image description here

关于javascript - JWT 刷新 token 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70893674/

相关文章:

javascript - 如何使用 javascript 和 react hooks 创建可拖动组件?

javascript - 我可以向 React 片段添加 key prop 吗?

javascript - 登录表单未呈现

javascript - jQuery animate() 函数不能移动一组嵌套元素?

javascript - 如何使用数据集值更新输入字段?

oauth-2.0 - WSO2 身份服务器 JWT 承载

javascript - 当不同组件使用 axiosinstance 调用 api 时,在哪里添加/删除拦截器

node.js - 如何将 JWT 从客户端传递到我的 API 以进行正确身份验证?

javascript - 在 AngularJS Controller 规范中测试来自服务的回调

javascript - 注释 javascript 以进行静态类型检查的好解决方案是什么?