使用Keycloak刷新令牌

4

我在 [Keycloak][2] 中使用 [JWT 用于客户端身份验证][1]:

 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"
}```

when I specify `client_id` I get:

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

If I specify `client_assertion_type` I get error that `client_assertion` itself is missing, so I literally have to provide parameters I provided when retrieved access token.

How that refreshing process actually should work?


  [1]: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-jwt-bearer-12#section-2.2
  [2]: https://www.keycloak.org
1个回答

5
这很可能是Keycloak定义的限制或策略。RFC7523(用于客户端认证的JWT)允许在存在JWT身份验证时启用客户端凭据。这在 3.1. 授权授予处理中有所强调。

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

因此,即使{{link2:Keycloak支持JWT客户端身份验证}},它仍然可能需要在刷新令牌请求中出现客户端凭据。但也可能是他们方面的限制。
此外,令牌刷新是通过RFC6749 - OAuth 2.0授权框架定义的。根据其第6节,当客户端是机密客户端(仅是使用ID和密码创建的客户端)时,刷新令牌请求必须包含客户端凭据。如果你所看到的不是限制,那么猜测Keycloak遵守RFC6749并要求你在令牌刷新请求中发送客户端凭据。

1
是的,不幸的是客户类型是保密的,所以我们必须发送所有凭据。非常感谢! - Sergii Getman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接