【发布时间】:2018-12-25 09:41:01
【问题描述】:
我正在两个不同的 docker 容器中部署 Keycloak 和 Spring Boot 应用程序,而 Keycloak 正在保护应用程序。
问题是用户通过浏览器登录,因此他们在localhost:8080 之类的地址上看到 Keycloak 服务器,而 Spring Boot 应用程序在它旁边的 docker 容器上运行,因此看到服务在像keycloak_service 这样的主机。
Spring Boot 应用程序从用户那里收到 Keycloak 给他的令牌,并看到它是由 localhost:8080 签名的,但它希望它是由 keycloak_service 签名的。然后它给出错误15:29:12.062 [http-nio-29000-exec-8] ERROR o.k.a.r.AdapterRSATokenVerifier - Didn't find publicKey for kid: b4A5E3xbvc-ulr-w_u38p7aHRZIi9O36Na7I8r_L76M
到目前为止,我一直在使用临时修复程序让应用程序使用主机网络堆栈,以便它可以在localhost:8080 看到 keycloak。不过,我最终需要更改这一点,因为我需要 docker 桥接网络的其他功能。
对于这个问题,我可以使用各种其他的 hacky 解决方案,但我不禁觉得这不应该是一个难题。我不能是唯一一个在容器中与 Keycloak 实例一起运行 Spring Boot 应用程序的人。我本以为自然的解决方案是告诉 Spring Boot 它可以在 keycloak_service 上与 keycloak 对话,但是对于某些客户端,相同的 Keycloak 实例也称为 localhost:8080,它也应该接受由它签名的令牌。这可能吗?如果没有,有没有其他正常的解决方法?
【问题讨论】:
标签: spring docker spring-boot spring-security keycloak