JWT 刷新令牌策略

JWT refresh token strategy

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

在服务器上,/refreshToken 端点正确检查 refreshtoken 没有过期,具有 refreshtoken 负载中 id 的用户仍然存在且有效(即:传递的 refreshToken 存在于他的 refreshTokens 中大批)。如果一切正常,将生成一个新的访问令牌,并随响应一起发回。

到目前为止一切顺利。 但是,在返回响应之前,也生成了一个新的refreshToken,并替换为旧的进入用户的refreshTokens数组......我认为这个策略是有缺陷的,因为这样用户永远不会看到他的登录过期,即使刷新令牌(在此示例中为一个月)将过期...

我确实做了一些测试(将 1 个月的值降低到 30 分钟),实际上用户授权永不过期...强制用户注销删除他的 refreshTokens 数组显然工作正常,但我希望当刷新令牌到期时注销。

请问我的理解是否正确(服务器上的 refreshToken 端点不应刷新刷新令牌,而应仅刷新访问令牌),或者我是否遗漏了什么。

UPDATE @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

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

在每次使用时替换刷新令牌是当前的最佳做法。

拥有 one-time 使用刷新令牌意味着如果刷新令牌被盗并多次使用(由您和黑客),令牌服务可以检测到并且 sign-out自动用户,保护用户免受攻击。

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