OAuth 客户端凭证流程 - 刷新令牌

问题描述 投票:0回答:3

场景

我最近构建了一个 API,并使用

OAuth
承载访问令牌保护其资源。

我使用了

Client_Credentials
流程,因为它将由客户端而不是用户访问。

事情是这样的,当客户成功提供

client_id
client_secret
时,他们会收到如下所示的响应:-

{
  "access_token": "<Access Token>",
  "token_type": "bearer",
  "expires_in": 1199,
  "refresh_token": "<Refresh Token>"
}

刷新令牌。

不太了解刷新令牌,我立即假设客户端能够向 OAuth 服务器提供

refresh_token
来检索新的
Access_Token

这“有点”正确。

为了使用

refresh_token
,客户端仍然需要传递
client_id
client_secret
以及
refresh_token
来获取新的访问令牌。

grant_type
也需要更改为
refresh_token

使用这个流程的refresh_token的好处在哪里?如果我每次都需要传递 client_id 和 client_secret,您肯定会完全避免使用刷新令牌吗?

oauth-2.0 oauth
3个回答
51
投票

使用客户端凭证授予颁发刷新令牌没有任何好处。 这就是为什么 RFC6749 第 4.4.3 节指示

A refresh token SHOULD NOT be included
。因此,其发行由授权服务器自行决定。

从我的角度来看,授权服务器永远不应该使用客户端凭据授予来颁发刷新令牌,因为访问令牌颁发过程将采取额外且不必要的步骤:

  • 在第一个请求时完成了具有 client_credentials 授予类型的访问令牌的颁发。
  • 在至少两次请求之后
  • ,将完成具有refresh_token授予类型的访问令牌的颁发,具体取决于您颁发给第一个访问令牌的方式。

0
投票

请注意,客户端可以为不同的资源所有者持有多个刷新令牌。这非常重要,因为这就是您需要刷新令牌的原因。另外请注意,客户端必须按照

rfc

中的规定进行身份验证。

如果客户端类型是机密的或者向客户端颁发了客户端凭据(或分配了其他身份验证要求),则客户端必须通过授权服务器进行身份验证。

因此,一旦用刷新令牌交换访问令牌,客户端必须使用其 client_id + client_secret (在授权承载中)进行身份验证 + 它必须发送有效的刷新令牌。同样,客户端可以对多个资源执行此操作,并且对于每个资源所有者(和范围),将有一个不同的刷新令牌(之前由授权令牌交换),尽管如此,客户端始终使用相同的凭据进行身份验证(对于相同的授权)服务器)。

关于客户端凭证流程,它特别指出

不应包含刷新令牌

,如顶部响应中所述。 不需要刷新令牌,因为客户端也是资源所有者,或者至少可以完全访问访问令牌授予的资源。这样,只需使用客户端 ID 和客户端密码进行身份验证就足够了。您可以声明您无法撤销刷新令牌,这可能是刷新令牌有用的唯一情况。尽管如此,某些授权服务器仍然会在客户端凭据授予上返回刷新令牌。


-4
投票

访问令牌用于与资源服务器通信。 与授权服务器通信时使用请求令牌。

您可以将其理解为您可能获得授权,但您的授权的确切期限需要不时重新评估。所以请求令牌就可以使用了。

© www.soinside.com 2019 - 2024. All rights reserved.