何时将刷新令牌传递给 API

Posted

技术标签:

【中文标题】何时将刷新令牌传递给 API【英文标题】:When to pass refresh token to API 【发布时间】:2017-06-15 19:13:11 【问题描述】:

我正在尝试访问授权服务器,当用户提供用户名和密码时,该服务器会发布短期访问令牌和长期刷新令牌。

    客户端是否应在每次调用 API 时将刷新令牌与访问令牌一起传递,或者客户端是否应仅在从 API 收到访问令牌已过期的错误代码时才传递刷新令牌? 刷新令牌过期后,哪种类型的错误代码会传回客户端?这意味着客户端需要通过再次传递用户名和密码来请求新的访问令牌。

【问题讨论】:

【参考方案1】:

问题 1:

客户端是否应该在每次调用 API 时将刷新令牌与访问令牌一起传递,或者客户端是否应该只在从 API 收到访问令牌已过期的错误代码时才传递刷新令牌?

在访问令牌过期之前,客户端不需要刷新令牌。 每个调用都需要访问令牌,但只有授予新访问令牌的请求才需要刷新令牌。

要获取新的访问令牌,请发送一个将grant_type 设置为refresh_token 的请求,如section 6 of the RFC。 理想情况下,您应该在当前访问令牌过期之前请求一个新的访问令牌,以免中断服务。

我见过的大多数实现都会发出一个带有每个访问令牌的新刷新令牌。您可以使用任何有效的 Refresh Token 来获取新的 Access Token。

问题 2:

刷新令牌过期后,会向客户端传回哪种类型的错误代码?这意味着客户端需要通过再次传递用户名和密码来请求新的访问令牌。

不幸的是,RFC 没有明确定义错误响应;请参阅 RFC 的第 7.2 节:

如果资源访问请求失败,资源服务器应该通知 错误的客户。虽然此类错误响应的细节超出了本规范的范围,但本文档在第 11.4 节中建立了一个通用注册表,用于在 OAuth 令牌身份验证方案之间共享错误值。

因此,确切的响应取决于服务器。它应该由相关服务器定义。

如果服务器提供新的刷新令牌,您需要在当前令牌过期之前获得一个新的刷新令牌。

您不想再次发送用户的凭据;你不应该拥有它们,更不用说保留它们了。 OAuth 2 旨在允许第三方在不查看用户凭据的情况下访问用户的受保护资源。

您通常会在password_grantrefresh_token 调用中获得带有新访问令牌的新刷新令牌。但 RFC 并不保证这一点。 如果服务器没有提供新的刷新令牌,或者不能依赖提供新的刷新令牌,您将不得不要求用户重新登录。请注意,此登录是通过授权服务器完成的,它不一定是您的应用程序。事实上,它可能不是。

【讨论】:

我明白您对访问令牌过期的看法,但是,刷新令牌最终将过期。此时,客户端将需要使用凭据重新进行身份验证。 @webworm 我已经更新了我的答案。大多数时候,刷新令牌的到期时间比会话长得多。在这些情况下,要求用户重新登录是没有问题的。

以上是关于何时将刷新令牌传递给 API的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Cognito 令牌传递给 Amazon API Gateway?

Swagger UI 将身份验证令牌传递给标头中的 API 调用

何时应该实现刷新令牌以及如何保持无状态?

将 AngularJs 控制器的令牌传递给 Laravel API

何时用刷新令牌交换访问令牌

Google Api,如何将访问令牌传递给API调用