【问题标题】:Checking token expiry on every request on the frontend检查前端每个请求的令牌过期时间
【发布时间】:2019-03-03 10:10:46
【问题描述】:

我正在使用 JWT 来验证我的 API 服务器。 JWT 由外部身份验证服务器(在本例中为 keycloak)发出,典型的过期时间约为 5 分钟 (IIRC),然后前端应使用这些令牌向 API 发出请求。

在发出每个请求之前,我一直在尝试检查前端令牌的到期日期。如果令牌过期,我使用刷新令牌首先获取新的身份验证令牌,然后发出请求。

基本的工作流程是:

== 登录 == 1. 获取授权令牌 2. 存储到期(exp)日期(以 UTC 秒为单位)

== API 请求 == 1.检查有效期(isExpired = expiryDate <= Math.floor(Date.now() / 1000)) 2. 如果OK => 提出请求 3. 否则,刷新授权令牌并重做请求。

这样检查日期是不好的做法吗?确保请求成功的替代方法是什么?

我问是因为我在某些机器上看到过期检查总是返回false(它没有过期)的问题......

【问题讨论】:

    标签: javascript ecmascript-6 jwt


    【解决方案1】:

    处理这种情况的最好方法是前端只检查后端设置的过期日期是否过期。通常错误返回就像这样 {name: 'TokenExpiredError', message: 'jwt expired'}。如果是这种情况,那么您将再次发出登录请求。

    【讨论】:

      【解决方案2】:

      依赖前端检查的问题是您无法控制用户机器上的本地时间,这可能是错误的。

      更可靠的方法是像往常一样发出请求,如果令牌已过期,则从服务器返回错误消息。在每个请求中,如果从服务器接收到错误消息,则客户端可以触发刷新过程,然后使用新令牌重新提交原始请求。

      【讨论】:

      • 是的,这似乎更强大 - 我想这通常不会导致流量增加(每次您需要刷新时额外的失败请求)?
      • 通常不会,除非您预计会有数十万个请求。你总是可以同时做这两个 - 首先检查客户端的过期时间,以决定是否跳过初始请求,如果失败,你就回退到上面详述的刷新策略。
      猜你喜欢
      • 1970-01-01
      • 2017-04-24
      • 2017-10-15
      • 2023-04-04
      • 1970-01-01
      • 2013-04-21
      • 2021-05-14
      • 2017-03-22
      • 2018-06-19
      相关资源
      最近更新 更多