【问题标题】:Should access tokens be refreshed automatically or manually?访问令牌应该自动刷新还是手动刷新?
【发布时间】:2021-02-22 21:26:34
【问题描述】:

在过去的几天里,我一直在阅读有关使用刷新和访问令牌进行身份验证的内容,但这是我找不到答案的一件事。假设发送了过期的访问令牌。后端应该自动刷新它(如果提供了刷新令牌),还是应该只在刷新端点处进行刷新?

例如,考虑以下两个身份验证流程:

自动刷新

  1. 用户使用用户名和密码进行身份验证。 API 会发回一个包含他的数据的短期访问令牌和一个长期刷新令牌。
  2. 对于需要身份验证/授权的每个请求,用户将在请求标头上发送两个令牌。
  3. 如果访问令牌已过期,API 将检查是否发送了有效的刷新令牌、是否处于活动状态以及是否与访问令牌属于同一用户。如果一切正常,它将签署一个新的访问令牌并用它更新响应标头。

前端不必担心刷新令牌,但它仍然需要在每次请求后查找响应头以检查是否发送了新令牌。

手动刷新

  1. 用户使用用户名和密码进行身份验证。 API 会发回一个包含他的数据的短期访问令牌和一个长期刷新令牌。
  2. 对于每个需要身份验证/授权的请求,用户将发送他的访问令牌。
  3. 当访问令牌过期时,用户会将他的刷新令牌发送到refresh/ 路由。 API 检查令牌是否有效。如果一切正常,它会返回一个新的访问令牌。

在每次请求后,客户端必须检查令牌是否过期,如果过期则必须执行新请求以刷新令牌。正在向服务器发出更多请求,但另一方面,职责更好地分离,因为 auth 路由只负责处理访问令牌,而刷新令牌处理存在于另一个路由中。

我很难找到有关该主题的资源,因此我不太确定哪种解决方案更好,或者即使我描述的解决方案完全正确。如果我必须选择一个,我会选择自动刷新,因为发出的请求更少,客户端可用性看起来更好,但正如我所说,我不是 100% 的,因此我正在制作那个线程.

应该如何刷新访问令牌?

【问题讨论】:

    标签: authentication oauth-2.0 access-token refresh-token


    【解决方案1】:

    在我看来,您在这里缺少一个角色,即授权服务器 (AS):

    • UI 重定向到 AS 以通过密码对用户进行身份验证
    • AS 发出访问令牌和刷新令牌,然后将它们返回给 UI
    • UI 使用访问令牌调用 API 一段时间
    • 最终访问令牌过期,API 返回 401 响应
    • UI 然后调用 AS 并刷新令牌以获取新的访问令牌
    • UI 然后使用新的访问令牌重试 API 调用
    • 最终刷新令牌过期,刷新尝试将失败
    • 然后用户界面将用户重定向以再次登录并重复循环

    刷新令牌始终是客户端的责任,并且只有访问令牌应该发送到 API。 API 唯一的 OAuth 工作是验证访问令牌并根据其内容进行授权。

    您可能有一个 API 正在执行授权服务器的工作。我的目标是区分这些角色。如果有帮助,我的Messages Blog Post 会在完整的 UI 和 API 解决方案中详细介绍消息。

    【讨论】:

      【解决方案2】:

      我知道的 OAuth2 协议的实现使用您在“手动刷新”下描述的流程。客户必须关心自己的清爽。

      客户端可以在每次请求之前检查 access_token 是否仍然有效,或者在请求失败后由于令牌响应无效而进行刷新。

      access_token 是短暂的,因此每次请求都发送它并被窃听和滥用的风险是有限的。 refresh_token 长期存在。如果您在每个请求中发送 refresh_token,攻击者就有更大的机会获得它。

      如果您在每个请求中都发送两个令牌,则不需要区分这两种类型。您只能使用一个长期存在的令牌。

      【讨论】:

        【解决方案3】:

        我的经验是 OAuth2 access_token 请求不喜欢额外的数据,这意味着您将无法同时发送 access_token 和 refresh_token。这将导致您描述为唯一选项的手动刷新方案

        【讨论】:

        • 为什么我不能同时发送两个令牌?我不能只使用x-refresh-tokenx-access-token 标头发送它们吗?
        • 我怀疑你会得到一个无效的请求响应
        猜你喜欢
        • 2015-10-05
        • 1970-01-01
        • 2020-04-05
        • 2018-09-14
        • 2014-09-06
        • 2016-08-21
        • 2021-09-23
        • 2019-06-29
        • 2018-07-26
        相关资源
        最近更新 更多