我如何 link 我的 SpringBoot 应用程序到特定的 keycloak 客户端?

How do I link my SpringBoot application to a specific keycloak client?

我正在尝试使用 keycloak 使用密码授予流程为我的 spring 启动应用程序实施身份验证系统,它在大多数情况下工作正常,有一点我不明白。

(我将参考 javacodegeeks 的示例源,因为我是通过他们的指南学习的。)

本指南中:https://examples.javacodegeeks.com/keycloak-in-a-spring-boot-application/

它说要在我的 application.properties 上设置以下配置:

# application configuration
server:
  port: 9000
# keycloak configuration
keycloak:
  # name of the created realm
  realm: jcgassignment
  # name of the created client
  resource: spring-security-demo-app
  # indicates that our service has been created as a bearer-only (by default it is false)
  bearer-only: true
  # url of our Keycloak server
  auth-server-url: 'http://localhost:8100/auth'

如果我没理解错的话,这个配置专门将我的 spring 启动应用程序与在我的 keycloak 领域内创建的客户端链接起来。告诉我的 keycloak 适配器连接到这个特定的 keycloak 服务器,进入这个特定的客户端,以验证 jwt 令牌。

但出于某种原因,即使我禁用客户端(在本例中为 spring-security-demo-app),我的 springboot 应用程序仍然能够与 keycloak 服务器通信并验证一个 jwt,因此仍然能够 return 一个 200OK 响应,怎么样?

我的 spring 引导应用程序是否未正确链接到我的 keycloak 领域客户端?还是我理解错了?

这可能是由于 JWT 的验证方式以及 Keycloak 处理其密钥集的方式。

客户端不需要显式调用发射器服务器来验证 JWT,这是一种无状态的验证方法。这些令牌在颁发时使用私钥生成,然后根据 public 证书进行验证。在 Keycloak 中,这些密钥集的范围仅限于领域,而不是客户端。

附加的是身份验证服务器通过 public URL(对于 Keycloak http://keycloak.domain.com/auth/realms/[REALM-ID]/protocol/openid-connect/certs )公开证书,客户端使用它来验证令牌 而无需将它们发送到身份验证服务器.

简而言之:JWTs只要没有过期并且证书允许他验证就有效。

为了回到您的案例,用户在客户端上进行了身份验证,并且 JWT 是使用领域密钥集生成的。如果之后在 Keycloak 上禁用客户端,使用的密钥集将保持活动状态,令牌也是如此。

一种解决方案是禁用密钥集并强制刷新客户端服务器可能保留的缓存。

这是 JWT 工作方式所固有的,而不是 Keycloak 特有的。

补充一下 Baptiste 的回答:当您在 Keycloak 中禁用客户端时,这意味着服务器将不再向客户端颁发新令牌。因此,客户端将无法对新用户进行身份验证,也无法刷新访问令牌。不过,只要证书未更改且令牌未过期,已经颁发给客户端的 JWT(如 Baptiste 所述)就有效。