场景
我最近构建了一个 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,您肯定会完全避免使用刷新令牌吗?
使用客户端凭证授予颁发刷新令牌没有任何好处。 这就是为什么 RFC6749 第 4.4.3 节指示
A refresh token SHOULD NOT be included
。因此,其发行由授权服务器自行决定。
从我的角度来看,授权服务器永远不应该使用客户端凭据授予来颁发刷新令牌,因为访问令牌颁发过程将采取额外且不必要的步骤:
请注意,客户端可以为不同的资源所有者持有多个刷新令牌。这非常重要,因为这就是您需要刷新令牌的原因。另外请注意,客户端必须按照
rfc如果客户端类型是机密的或者向客户端颁发了客户端凭据(或分配了其他身份验证要求),则客户端必须通过授权服务器进行身份验证。因此,一旦用刷新令牌交换访问令牌,客户端必须使用其 client_id + client_secret (在授权承载中)进行身份验证 + 它必须发送有效的刷新令牌。同样,客户端可以对多个资源执行此操作,并且对于每个资源所有者(和范围),将有一个不同的刷新令牌(之前由授权令牌交换),尽管如此,客户端始终使用相同的凭据进行身份验证(对于相同的授权)服务器)。
关于客户端凭证流程,它特别指出
不应包含刷新令牌,如顶部响应中所述。 不需要刷新令牌,因为客户端也是资源所有者,或者至少可以完全访问访问令牌授予的资源。这样,只需使用客户端 ID 和客户端密码进行身份验证就足够了。您可以声明您无法撤销刷新令牌,这可能是刷新令牌有用的唯一情况。尽管如此,某些授权服务器仍然会在客户端凭据授予上返回刷新令牌。
访问令牌用于与资源服务器通信。 与授权服务器通信时使用请求令牌。
您可以将其理解为您可能获得授权,但您的授权的确切期限需要不时重新评估。所以请求令牌就可以使用了。