为什么响应 "client_credentials" 授权的 OAuth2 服务器不提供 refresh_token?

Why is a refresh_token not provided by OAuth2 servers responding to a "client_credentials" grant?

我正在阅读 OAuth2 规范:

https://www.rfc-editor.org/rfc/rfc6749#section-4.4.2

特别是关于 client_credentials 授权类型的部分。

If the access token request is valid and authorized, the
authorization server issues an access token as described in Section 5.1.
A refresh token SHOULD NOT be included. If the request failed client authentication or is invalid, the authorization server returns an error response as described in Section 5.2.

成功响应示例:

 HTTP/1.1 200 OK
 Content-Type: application/json;charset=UTF-8
 Cache-Control: no-store
 Pragma: no-cache

 {
   "access_token":"2YotnFZFEjr1zCsicMWpAA",
   "token_type":"example",
   "expires_in":3600,
   "example_parameter":"example_value"
 }

`


我有点困惑为什么授权服务器可以 return refresh_tokens password 授权类型而不是 client_credentials.

我猜这与 refresh_token 可以换成 access_token 这一事实有关,因为 client_credentials 授权类型不需要用户名和密码,如果您的应用程序密钥和 refresh_token 遭到破坏,撤销会变得更加困难吗?

使用客户端凭据授权时,客户端应用程序使用其客户端 ID 和客户端密码向授权服务器进行身份验证。如果获得授权,它会取回资源的访问令牌。在这种情况下没有用户交互,因此无需发出刷新令牌。

当访问令牌过期时,客户端可以使用自己的凭据请求新令牌。当客户端想要代表用户访问资源时使用刷新令牌(当时可能不与客户端交互)。

在这种情况下,客户代表自己行事。

在应用资源所有者密码凭证授权时,return 刷新令牌是有意义的,这样客户端就不需要存储或缓存资源所有者的密码 - 正如资源所有者最初在一种互动方式 - 获取新的访问令牌。

在客户端凭据流程中,客户端凭据无论如何都是从存储中提供的 - 以离线方式 - 因此刷新令牌不会比再次重新使用客户端凭据获得任何安全性或可用性优势(客户端无论如何都可以访问这些)以获取新的访问令牌。

理解这一点的关键部分是,refresh 概念并非设计用于刷新您已有的任何访问令牌。

"refresh token" 只是一种跳过最终用户干预并仍然重新获得新访问令牌的方法,如果您的应用程序正在使用最终用户 username/password 身份验证,即代表特定的终端进行操作用户。 (如果我是设计者,我可能会把"refresh token"命名为"bypass-user-intervention token",所以现在的问题就不用问了。)

但如果您的应用使用客户端凭据进行身份验证,则它代表自己行事,您根本不需要用户干预,服务器也不需要(也不会)提供你也是一个刷新令牌。