我在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
本身缺失,因此我必须提供我在获取访问令牌时提供的参数。
该刷新过程实际上应该如何工作?
答案 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,并要求您在令牌刷新请求中发送客户端凭据。