6

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

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

1 回答 1

5

问题一:

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

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

要获取新的访问令牌,您需要发送一个grant_type设置为的请求refresh_token,如RFC 的第 6 节中所述理想情况下,您会在当前访问令牌过期之前
请求新的访问令牌,以免中断服务。

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

问题2:

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

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

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

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

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

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

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

于 2017-01-30T15:11:18.630 回答