访问令牌应该自动还是手动刷新?

时间:2020-11-10 22:00:42

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

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

作为示例,请考虑以下两个身份验证流程:

自动刷新

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

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

手动刷新

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

在每个请求之后,客户端必须检查令牌是否过期,如果已过期,则必须执行新请求以刷新令牌。向服务器发出了更多请求,但另一方面,由于auth路由仅负责处理访问令牌,而刷新令牌的处理则位于另一条路由中,因此更好地分离了责任。

我很难找到有关该主题的资源,因此我不确定要哪种解决方案更好,甚至我所描述的解决方案都是正确的。如果我必须选择一个,那么我将使用“自动刷新”,因为发出的请求更少,并且客户端可用性看起来更好,但是正如我所说的,我对此并不是100%的,因此我正在创建该线程

应该如何刷新访问令牌?

3 个答案:

答案 0 :(得分:1)

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

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

access_token生存期很短,因此,随每个请求发送它以及被窃听和滥用的风险是有限的。 refresh_token是长期存在的。如果您在每次请求时都发送refresh_token,则攻击者更有机会抓住它。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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