带有刷新令牌的 Keycloak 客户端凭据授予类型

dev*_*123 8 access-token oauth-2.0 openid-connect keycloak refresh-token

我在 keycloak (7.0.0) 中有一个具有给定配置的客户端 - 突出显示选项“启用对‘客户端凭据授予’的支持”:

Keycloak客户端配置

当我获取该客户端的令牌 (POST /auth/realms/{my-realm}/protocol/openid-connect/token) 时,我收到以下 json 响应:

{
  "access_token": "xxx",
  "expires_in": 600,
  "refresh_expires_in": 1800,
  "refresh_token": "xxx",
  "token_type": "bearer",
  "not-before-policy": 1572415518,
  "session_state": "xxx",
  "scope": "xxx xxx"
}
Run Code Online (Sandbox Code Playgroud)

我想将它与OAuth2FeignRequestInterceptor集成,默认情况下它会忽略刷新令牌并每秒创建一个新会话access_tokenexpires_in

if (accessToken == null || accessToken.isExpired()) {
            try {
                // no refresh token usage here
                accessToken = acquireAccessToken();
            }
            ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 为什么我会收到 的刷新令牌client_credentials,它是后端 -> 后端通信的授予类型?OAuth2 文档链接明确指出对于授权类型“不应包含刷新令牌” client_credentials
  2. 是否可以将 keycloak 配置为不向client_credentials授予类型的客户端发送刷新令牌?
  3. 如果对 2. 的回答是“否” - 我是否必须实现自己的带有刷新令牌支持的假请求拦截器?
  4. 如果客户端范围包括offline_access-refresh_expires_in0根据我的理解,刷新令牌是离线令牌。这里是keycloak 邮件列表的链接,其中 keycloak 团队的某人建议使用离线令牌 - 这是否与 OIDC 授予client_credentials类型规范相冲突?

小智 6

我的回答可能有点太晚了,但 Keycloak 最近添加了在client_credentials授权情况下禁用刷新令牌的支持。这是12.0.0在 2020 年 12 月发布的版本中实现的。

以下是指向该内容的文档部分:https://www.keycloak.org/docs/12.0/release_notes/#other-improvements

在此版本之前,不可能禁用刷新令牌,因此您确实必须编写自己的版本,OAuth2FeignRequestInterceptor该版本要么忽略刷新令牌(并尝试获取新的访问令牌),要么使用刷新令牌来获取更新的访问令牌。我会选择第一个解决方案,因为它更接近 OAUTH2规范