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

Posted

技术标签:

【中文标题】带有刷新令牌的 Keycloak 客户端凭据授予类型【英文标题】:Keycloak client credentials grant type with refresh token 【发布时间】:2020-02-25 11:59:32 【问题描述】:

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

当我获得该客户端的令牌 (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"

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

if (accessToken == null || accessToken.isExpired()) 
            try 
                // no refresh token usage here
                accessToken = acquireAccessToken();
            
            ...

我的问题是:

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

【问题讨论】:

您正在引用 OneLogin。您是否将它们用作您的 IDP?如果没有,请不要依赖他们的文档。客户端凭据的详细信息是特定于实现的。这用于双方都受信任的安全服务器到服务器。当您使用为您管理它的库时,为什么要关心刷新令牌?令牌刷新的最终结果与新令牌相同。对于客户端凭据,不需要刷新令牌,因为双方都知道机密(客户端 ID、客户端机密)。如果您想提高安全性,请不要使用客户端凭据。 “当你使用一个为你管理它的库时,你为什么关心刷新令牌?” - 不幸的是,提到的OAuth2FeignRequestInterceptor 不管理刷新令牌。拦截器只是忽略刷新令牌并使用客户端 ID 和秘密获取新的访问令牌,这每次都会创建一个新会话。我不知道是否可以使用 Keycloak 的confidential access-type 客户端仅获取访问令牌,而无需刷新。如果不可能,我想到的唯一方法是支持刷新令牌的自定义拦截器实现。 会话是什么意思? OAuth 不创建会话。刷新访问令牌会创建一个新的访问令牌,旧的会失效。创建新的访问令牌与在应用程序视图中刷新现有访问令牌相同。 OAuth 规范声明不应包含刷新令牌。该代码忽略了刷新令牌。这会导致什么问题?如果这是 KeyCloak 库错误,*** 不是正确的地方。 imgur.com/a/ZjbXZ1U - 看看这里 - 这就是我的意思 【参考方案1】:

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

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

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

【讨论】:

以上是关于带有刷新令牌的 Keycloak 客户端凭据授予类型的主要内容,如果未能解决你的问题,请参考以下文章

Oauth 刷新令牌授予类型

通过 Spring Boot Keycloak 集成的 OAuth2 客户端凭据流

Keycloak 令牌生成不起作用 - 未经授权的凭据

为啥 keycloak 在页面刷新时未经授权?

无法通过 Postman 在 Django oauth 工具包客户端凭据授予中获取访问令牌

使用 Keycloak 刷新令牌