使用Keycloak刷新令牌

时间:2018-11-19 10:16:54

标签: oauth-2.0 openid openid-connect keycloak

我在JWT for Client Authentication中使用Keycloak

 POST /token.oauth2 HTTP/1.1
 Host: as.example.com
 Content-Type: application/x-www-form-urlencoded

 grant_type=authorization_code&
 code=vAZEIHjQTHuGgaSvyW9hO0RpusLzkvTOww3trZBxZpo&
 client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3A
 client-assertion-type%3Ajwt-bearer&
 client_assertion=eyJhbGciOiJSUzI1NiJ9.
 eyJpc3Mi[...omitted for brevity...].
 cC4hiUPo[...omitted for brevity...]

我明白了:

assess_token
refresh_token
token_type
expires_in

当我尝试刷新令牌时,我自己发送refresh_token,授予类型refresh_token并获得:

{ "error": "unauthorized_client", "error_description": "INVALID_CREDENTIALS: Invalid client credentials" }

当我指定client_id时,我得到:

{ "error": "invalid_client", "error_description": "Parameter client_assertion_type is missing" }

如果我指定client_assertion_type,则会收到错误消息,提示client_assertion本身缺失,因此我必须提供我在获取访问令牌时提供的参数。

该刷新过程实际上应该如何工作?

1 个答案:

答案 0 :(得分:2)

这很可能是Keycloak定义的限制或政策。当存在JWT身份验证时,RFC7523(用于客户端身份验证的JWT)确实允许启用客户端凭据。这是从3.1. Authorization Grant Processing

中突出显示的
  

JWT授权授予可以与客户端一起使用,也可以不与客户端一起使用      身份验证或标识。客户是否      需要结合JWT授权进行身份验证      授予以及受支持的客户端身份验证类型是      授权服务器自行决定策略决策。      但是,如果请求中包含客户端凭据,则      授权服务器必须对其进行验证。

因此,即使Keycloak support JWT client authentication,它仍可能需要客户端凭据才能出现在刷新令牌请求中。但是,从它们的结尾来看,这可能是一个限制。

此外,令牌刷新是通过RFC6749 - The OAuth 2.0 Authorization Framework定义的。根据{{​​3}},当客户端是机密客户端(仅是使用id和密码创建的客户端)时,刷新令牌请求必须包含客户端凭据。如果您看到的不是一个限制,则猜测Keycloak遵守RFC6749,并要求您在令牌刷新请求中发送客户端凭据。