我正在两个不同的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
上看到密钥隐藏。我最终将需要更改此设置,因为我需要Docker桥网络的其他功能。
我可以使用各种其他解决方案来解决该问题,但是我不禁感到这不是一个难题。我不是唯一一个在容器中的Keycloak实例旁边运行spring boot应用程序的人。我本来以为自然的解决方案是告诉Spring Boot它可以与keycloak_service
上的keycloak进行通信,但是对于某些客户端,相同的Keycloak实例也称为localhost:8080
,它应该接受由那也是。这可能吗?如果不是,是否有其他解决此问题的正常方法?
答案 0 :(得分:2)
您的问题是,您需要使Keycloak可以从外部正确访问,而不仅是在服务器内部。像a= np.array([[1],[1],[0],[0]])
b= np.array([[ 1. ],[-0.5 ],[-0.8660254],[ 0. ]])
c= np.array([[ 1],[-1],[ 0],[ 0]])
d=np.array([[ 1],[0.5],[0.86], [0]])
a-b+c
array([[1. ],
[0.5 ],
[0.8660254],
[0. ]])
这样的docker容器ID对于内部服务通信是有效的,但是在这里,浏览器正在请求url,因此没有必要使用它。
对于我的具体情况,我为此任务配置了一个nginx代理,为服务器分配了两个名称,但是代理转发到了我感兴趣的端口。
例如,假设您将服务器称为keycloak_service
和myapp.com
。然后,假设您为密钥斗篷服务器发布了端口8080,为应用程序发布了8081。您需要以这种方式配置nginx:
auth.myapp.com
然后,您将客户端设置为与server {
server_name myapp.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
server {
server_name auth.myapp.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
合作。另外,不要忘记将keycloak配置为work behind a proxy(您可能需要使用正确的配置来重建docker映像)。
另请参见:
答案 1 :(得分:0)
由于我没有添加评论的声誉,因此我将按照这种方式进行操作。
我具有与@Xtreme Biker上文所述类似的设置,但是我的应用仍然无法通过使用server_name
配置中配置的nginx
与keycloak通信。我可以从浏览器中调用myapp.com
,然后将其重定向到auth.myapp.com
(密钥斗篷)进行登录。成功登录后,密钥斗篷将使用有效的myapp.com
重定向回到authorization_code
(如我在调试时所见)。然后,myapp.com尝试通过调用authorization_code
来交换http://auth.myapp.com/auth/realms/my-relam/protocol/openid-connect/token
,但是它无法连接,并失败:java.net.ConnectException: Connection refused (Connection refused)
。
遇到类似问题的人找到了解决方案吗?