首页 文章

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

提问于
浏览
11

我正在阅读OAuth2规范:

https://tools.ietf.org/html/rfc6749#section-4.4.2

特别是 client_credentials grant类型的部分 .

如果访问令牌请求有效且已获得授权,则授权服务器将按照第5.1节中的说明发出访问令牌 . 刷新令牌不应该包括在内 . 如果请求未通过客户端身份验证或无效,则授权服务器将返回错误响应,如第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"
 }

`


我有点困惑为什么授权服务器可以为 password grant类型返回refresh_tokens但不能为 client_credentials 返回 .

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

3 回答

  • 14

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

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

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

  • 6

    理解这一点的关键部分是, refresh 概念并非旨在刷新您已有的任何访问令牌 .

    如果您的应用使用最终用户用户名/密码身份验证,即代表特定的最终用户行事,则“刷新令牌”只是一种跳过最终用户干预并仍然重新获得新访问令牌的方法 . (如果我是设计师,我可能会将“刷新令牌”命名为“绕过用户干预令牌”,因此不需要询问当前的问题 . )

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

  • 4

    在应用资源所有者密码凭据授权时,返回刷新令牌是有意义的,这样客户端就不需要存储或缓存资源所有者的密码 - 最初由资源所有者以交互方式提供 - 以获得新访问权限令牌 .

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

相关问题