代码之家  ›  专栏  ›  技术社区  ›  MarcoS

JWT刷新令牌策略

  •  0
  • MarcoS  · 技术社区  · 4 年前

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

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

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

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

    我问我的理解是否正确(服务器上的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
    

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

    0 回复  |  直到 4 年前
        1
  •  8
  •   Tore Nestenius    4 年前

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

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

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