JWT刷新令牌策略

Mar*_*coS 6 javascript access-token jwt reactjs refresh-token

我在博客(此处)中看到有关使用 JWT 在 React 中进行身份验证的内容,此设置:访问令牌到期时间为 15 分钟,刷新令牌到期时间为 1 个月;每 10 分钟客户端调用/refreshToken端点一次,检查刷新令牌是否仍然有效(否则用户将看到登录屏幕)。

在服务器上,/refreshToken端点正确检查刷新令牌是否未过期,刷新令牌有效负载中具有 ID 的用户仍然存在且有效(即:传递的刷新令牌存在于其刷新令牌数组中)。如果一切正常,则会生成一个新的访问令牌,并与响应一起发回。

到目前为止,一切都很好。但是,在返回响应之前,也会生成一个新的刷新令牌,并将旧的刷新令牌替换到用户的刷新令牌数组中...我认为这种策略是有缺陷的,因为这样用户就永远不会看到的登录过期,即使在之后刷新令牌(本例中为一个月)将过期...

我确实做了一些测试(将 1 个月值降低到 30 分钟),并且实际上用户授权永远不会过期...强制注销用户删除其刷新令牌数组显然效果很好,但我希望刷新时会注销令牌按年龄过期。

我询问我的理解是否正确(服务器上的refreshToken端点不应刷新刷新令牌,而应仅刷新访问令牌),或者我是否错过了某些内容。

@Ghero 评论后更新:我明白你的观点...但是如果不更新令牌的过期时间,为什么要刷新令牌呢?
然而,博客的代码用于更新刷新令牌:

    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
Run Code Online (Sandbox Code Playgroud)

看起来总是把到期日期推迟到未来30天。这样就永远不会过期了...

And*_*ndy 8

当前的最佳实践是在每次使用时更换刷新令牌。

拥有一次性刷新令牌意味着,如果刷新令牌被盗并多次使用(由您和黑客),令牌服务可以检测到这一情况并自动注销用户,从而保护用户免受攻击。

刷新令牌的有效时间有一个最长时间,例如 30 天,但这通常也是您可以配置的。根据您使用的服务,有不同的刷新令牌生存期策略。下图展示了IdentityServer如何处理刷新令牌: 在此输入图像描述