oauth-2.0 - 使用 Keycloak 刷新令牌
问题描述
我在 [Keycloak][2] 中使用 [JWT for Client Authentication][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
解决方案
这很可能是 Keycloak 定义的限制或策略。RFC7523(用于客户端身份验证的 JWT)确实允许在存在 JWT 身份验证时启用客户端凭据。这在3.1中突出显示。授权授予处理
JWT 授权授权可以在有或没有客户端身份验证或标识的情况下使用。客户端身份验证是否需要与 JWT 授权授权一起使用,以及支持的客户端身份验证类型,都是授权服务器自行决定的策略决策。但是,如果请求中存在客户端凭据,授权服务器必须验证它们。
因此,即使Keycloak 支持 JWT 客户端身份验证,它仍可能需要客户端凭据出现在刷新令牌请求中。但是,这可能是他们最终的限制。
此外,令牌刷新是通过RFC6749 - OAuth 2.0 授权框架定义的。根据它的第 6 节,当客户端是机密客户端(只是使用 id 和密码创建的客户端)时,刷新令牌请求必须包含客户端凭据。如果您看到的不是限制,那么猜测 Keycloak 遵守 RFC6749 并要求您在令牌刷新请求中发送客户端凭据。
推荐阅读
- typo3 - 后端登录只有一个会话
- c# - ASP.NET Web API 2 使用 Get 方法从表多个参数中搜索数据
- c# - Ajax 将数组和布尔值发送到控制器方法
- terraform - 了解 OCI 的 terraform
- python - GDALWarp 返回 NULL 而不设置错误
- python - NumPy 中索引矩阵向量的最简单方法是什么,不包括每行中的一个索引?
- javascript - 从位于子文件夹中的文件中获取 HTML 输入值?
- c# - 检查是否启用了延迟加载
- qt - 如何为 QNetworkCookie 实现 qHash
- assembly - “gdb-> info register”的输出中的中间列代表什么?