所以我创建了一个 java spring boot 应用程序,它使用 Keycloak 来验证其用户。当我从 docker-compose 运行 keycloak 时,我可以在将应用程序作为独立 jar 文件运行或调试时成功进行身份验证。但是当我将 Spring Boot 应用程序作为 docker 容器放入 docker-compose 中时。我无法再对用户进行身份验证。
我来自 spring boot docker 容器的错误日志:
springBootApp | 2019-12-19 13:16:41.498 ERROR 1 --- [nio-8081-exec-2] o.k.a.rotation.JWKPublicKeyLocator : Error when sending request to retrieve realm keys
springBootApp |
springBootApp | org.keycloak.adapters.HttpClientAdapterException: IO error
Run Code Online (Sandbox Code Playgroud)
我认为问题出在网络上。但所有容器都在同一个虚拟网络中运行。它们也位于同一个 docker-compose 文件中。
这是我的钥匙斗篷部分:
keycloak:
image: jboss/keycloak
ports:
- 18080:8080
volumes:
- ../keycloak:/opt/jboss/keycloak/imports
command:
- "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/realm-export.json"
environment:
- KEYCLOAK_USER=admin
- KEYCLOAK_PASSWORD=admin
Run Code Online (Sandbox Code Playgroud)
我的春季启动应用程序
mySpringBootApp:
image: mySpringBootApp:master-1
environment:
- SPRING_PROFILES_ACTIVE=developmentTest …Run Code Online (Sandbox Code Playgroud) 所以我有一个弹簧启动应用程序。我也使用 swagger 进行测试。我在 docker-compose 中定义了一个 keycloak,如下所示:
keycloak:
image: jboss/keycloak
ports:
- "18080:8080"
volumes:
- ../keycloak:/opt/jboss/keycloak/imports
command:
- "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/realm-export.json"
environment:
- KEYCLOAK_USER=admin
- KEYCLOAK_PASSWORD=admin
Run Code Online (Sandbox Code Playgroud)
当我尝试运行我的 Spring Boot 应用程序时,我将其http://localhost:18080/auth用作keycloak_auth_url. 从我的机器上运行时,一切正常。
通过 docker-compose 运行时,我将 keycloak url 更改为:http://keycloak:18080/auth
但 swaggers 用于将用户重定向到 keycloak 的 url 保持不变http://localhost:18080/auth
通过招摇“有效”进行身份验证。但是当我尝试以经过身份验证的用户身份调用 API 端点时,我的服务器返回以下错误:
Error when sending request to retrieve realm keys
myApp |
myApp | org.keycloak.adapters.HttpClientAdapterException: IO error
Run Code Online (Sandbox Code Playgroud)
Didn't find publicKey for kid: U7a58q_oR3zXWSAwVUIa_7FvhdA7IncCQ2IfKQKDGfI
myApp | 2020-01-07 11:58:40.615 ERROR 1 --- …Run Code Online (Sandbox Code Playgroud)