如何在 Kubernetes 上的 Quarkus 中设置与 Keycloak 的 OIDC 连接

Posted

技术标签:

【中文标题】如何在 Kubernetes 上的 Quarkus 中设置与 Keycloak 的 OIDC 连接【英文标题】:How to set up OIDC connection to Keycloak in Quarkus on Kubernetes 【发布时间】:2021-10-02 13:03:21 【问题描述】:

是否有人成功地在 Kubernetes 集群中部署的 Quarkus 应用程序中建立了与 Keycloack 的 OIDC 连接? 您能否澄清connection-delay(和其他相关参数)是如何工作的? (Here is the documentation我试图关注)

在我们的环境中(Quarkus 1.13.3.Final,Keycloak 12.0.4)我们有这样的配置:

quarkus.oidc.connection-delay: 6M quarkus.oidc.connection-timeout: 30S quarkus.oidc.tenant-id: testTenant-01

这些消息在 pod 启动时出现在它的日志中:

2021-07-26 14:44:22,523 信息 [主要] [OidcRecorder.java:264] - 每 2 秒最多连接到 IDP 180 次 2021-07-26 14:44:24,142 调试 [vert.x-eventloop-thread-1] [OidcRecorder.java:115] - 'testTenant-01' 租户初始化失败: 'OpenId Connect Provider 配置元数据未配置并且 不能被发现”。访问受此租户保护的资源 将失败并返回 HTTP 401。

(...随着 pod 运行,后续日志稍后会出现...)

2021-07-27 06:11:54,261 调试 [vert.x-eventloop-thread-0] [DefaultTenantConfigResolver.java:112] - 租户 'null' 不是 初始化 2021-07-27 06:11:54,262 错误 [vert.x-eventloop-thread-0] [QuarkusErrorHandler.java:101] - HTTP 对 /q/health/live 的请求失败,错误 ID: 89f83d1d-894c-4fed-9995-0d42d60cec17-2:io.quarkus.oidc.OIDCException: 租户配置尚未解决 io.quarkus.oidc.runtime.OidcAuthenticationMechanism.resolve(OidcAuthenticationMechanism.java:61) 在 io.quarkus.oidc.runtime.OidcAuthenticationMechanism.authenticate(OidcAuthenticationMechanism.java:40) 在 io.quarkus.oidc.runtime.OidcAuthenticationMechanism_ClientProxy.authenticate(OidcAuthenticationMechanism_ClientProxy.zig:189) 在 io.quarkus.vertx.http.runtime.security.HttpAuthenticator.attemptAuthentication(HttpAuthenticator.java:100) 在 io.quarkus.vertx.http.runtime.security.HttpAuthenticator_ClientProxy.attemptAuthentication(HttpAuthenticator_ClientProxy.zig:157) 在 io.quarkus.vertx.http.runtime.security.HttpSecurityRecorder$2.handle(HttpSecurityRecorder.java:101) 在 io.quarkus.vertx.http.runtime.security.HttpSecurityRecorder$2.handle(HttpSecurityRecorder.java:51) 在 io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1038)

问题:

    有什么方法可以找出缺少哪些元数据? 我能以某种方式更改连接尝试之间的 2 秒时间吗? 连接延迟和连接超时之间有什么关系吗? 它在 cca 2s 后失败 - 是否意味着它在第一次尝试时立即失败,或者它如此快地完成了 180 次尝试? DefaultTenantConfigResolver 在初始化时是否从与OidcRecorder 不同的资源获取租户,即是否应在多个位置配置租户?

【问题讨论】:

是的,我已经使用 oicd 插件运行带有 keycloak 的 quarkus 至少一年了。你的授权方案是什么?,你打算使用受保护的资源还是只验证 JWT 令牌并从中检索信息? 作为对一般错误的响应,您似乎缺少非租户配置的多租户配置。这意味着正如您在堆栈中看到的那样,无租户正在解析,因此没有从您的属性或租户解析器加载配置,这似乎是您的错误的原因 @karelss 我们需要管理对API的访问,主要使用RolesAllowed注解。 no-tenant 正在解决,因此没有从您的属性加载配置 - 请您澄清一下吗?在 2021-07-26 14:44:24,142 的日志消息中,您可以看到租户已加载,但稍后在 2021-07-27 06:11:54,261 它说租户为空。 是的,我错过了那个日志条目,你能发布你的应用程序属性文件或最终配置来检查你有什么吗?只需将 放在出现私人信息的地方 【参考方案1】:

终于成功了。由不正确的 auth-server-url 引起,从日志消息中根本不清楚

quarkus.oidc.client-id: my-app
quarkus.oidc.enabled: true
quarkus.oidc.connection-delay: 6M
quarkus.oidc.connection-timeout: 30S
quarkus.oidc.tenant-id: testTenant-01
quarkus.oidc.auth-server-url: $keycloak.url/auth/realms/$quarkus.oidc.tenant-id

Quarkus doc 中强调了 URL 格式:请注意,如果您使用 Keycloak OIDC 服务器,请确保基本 URL 采用以下格式:https://host:port/auth/realms/realm 其中 realm 必须替换为 Keycloak 领域的名称

【讨论】:

很高兴你找到了问题,这也发生在我第一次设置项目时,在我的情况下,我必须将 oidc 插件日志级别设置为 ALL 才能找到问题

以上是关于如何在 Kubernetes 上的 Quarkus 中设置与 Keycloak 的 OIDC 连接的主要内容,如果未能解决你的问题,请参考以下文章

」打造基于Quarkus的云原生微服务框架实践的理论知识基础

2021年全新java架构技术框架Quarkus实战神仙文档

Quarkus技术系列「云原生架构实战」配置参考指南相关的功能机制配置介绍分析

Quarkus:面向Java开发人员的云原生开源框架

Quarkus:面向Java开发人员的云原生开源框架

使用Quarkus在Openshift上构建微服务的快速指南