何时刷新访问令牌

问题描述 投票:0回答:3

我的问题是确定何时刷新访问令牌。

我读过,我应该在每次请求之前刷新新的访问令牌,但它在其他地方说不建议这样做。所以我的问题是我是否应该在每次请求之前刷新访问令牌,或者发送请求并在收到 401 未经授权状态后刷新访问令牌并重试对指定资源的请求。

oauth-2.0 openid-connect refresh-token
3个回答
8
投票

您可以采取任何一种方式,您知道您的访问令牌即将过期,例如 1 分钟前,您使用刷新令牌来获取一组新的刷新/访问令牌。

在 401 上执行此操作也是一种选择,但这意味着您需要执行额外的请求,并且还需要注意一些竞争条件,因为在许多配置中您只允许一次性使用刷新令牌(您每次都会获得一个新的刷新令牌)。因此,使用 401 方法,您需要确保不会发送许多并发请求来为同一用户获取新令牌。


7
投票

您可以从访问令牌获取到期时间(通常在名为

exp
的字段中,格式为 unix 时间戳)。因此,每当您准备向资源服务器发送 HTTP 请求时,您都可以检查访问令牌是否已经过期或即将过期(例如 60 秒)。

如果是,请尝试使用刷新令牌获取新的访问令牌,并更新返回的存储在应用程序内的新访问令牌和刷新令牌。否则,只需继续使用现有的访问令牌即可。


0
投票

为每个请求获取新的访问令牌是一种非常糟糕的做法,应该避免,因为它可能会导致性能和安全问题。此外,只要您拥有有效的、未过期的访问令牌,就根本不需要这样做。

要在过期(或即将过期)时获取新的访问令牌,有两种方法:

  • 出现 401 错误时刷新令牌。
  • 在令牌过期前刷新令牌。

我认为后者更方便,我会建议它。第一种方法的问题是:

  1. 情况更加复杂,因为您必须处理可能在第一个 401 响应之后和令牌更新之前发送请求的情况。实际上,在第一个 401 响应之后,您必须将所有即将到来的请求放入队列中,并且仅在令牌更新后才发送它们。
  2. 您必须区分因有效令牌已过期而收到 401 的情况以及令牌无效/不存在的情况。如果您收到连续的 401 响应,那么这是实际的 401 响应,而不是令牌更新案例。
  3. 某些 API 调用只是在用户经过身份验证时在响应中返回更多字段,而在用户未经身份验证时返回较轻的响应(不是 401 响应)。在这种情况下,将不会触发令牌更新,并且很可能您将不得不面对一些错误(预计响应中不会包含数据)。
  4. 就个人而言,当我的应用程序按预期运行并且用户成功登录时,我不喜欢在网络选项卡中看到 401。

总而言之,我会采用“过期前刷新”的方法。

© www.soinside.com 2019 - 2024. All rights reserved.