请考虑以下环境:
Web应用程序是一个Spring Boot应用程序,其中应用了“ keycloak-spring-boot-starter”。在application.properties中:
keycloak.auth-server-url = http://localhost:8028/auth
访问我们Web应用程序的用户将使用keycloak docker容器公开端口的URL重定向到keycloak。登录完成后,密钥库中没有问题,并且用户(浏览器)再次重定向到我们的Web应用程序。现在,需要将授权代码交换为访问令牌。因此,我们的Web应用程序(keycloak客户端)尝试连接到 keycloak.auth-server-url 中配置的相同主机和端口。但这是一个问题,因为Web应用程序驻留在Docker容器中而不是主机中,因此它应访问 http://keycloak:8080 或 keycloak 所在的内容链接的keycloak泊坞窗容器。
所以问题是:如何配置密钥斗篷客户端以为浏览器重定向和访问令牌端点应用不同的URL?
答案 0 :(得分:1)
曾经有另一个属性auth-server-url-for-backend-requests
,但被removed by pull request #2506作为issue #2623 on Keycloak's JIRA的解决方案。在此问题的描述中,您将找到原因和可能的解决方法的原因:应在DNS级别或通过将条目添加到主机文件来解决。
因此,除非更改代码并创建自己的适配器版本,否则在客户端配置中您无能为力,但是您可以在Docker级别上做一些事情。为了使它正常工作,首先,我建议您使用完全限定的域名代替localhost
作为 public 主机名,就像您在生产中一样。 keycloak.mydomain.com
。如果您只是将主机的/etc/hosts
文件(或Windows等效文件)添加为localhost
旁边的别名,则可以使用伪造的文件(未在DNS服务器中注册)。
然后,如果您使用的是Docker Compose,则可以为与容器连接的Docker网络上的keycloak服务设置aliases(备用主机名)(请参阅doc:撰写文件参考/服务配置参考/网络/别名)。例如:
version: "3.7"
services:
keycloak:
image: jboss/keycloak
networks:
# Replace 'mynet' with whatever user-defined network you are using or want to use
mynet:
aliases:
- keycloak.mydomain.com
webapp:
image: "nginx:alpine"
networks:
- mynet
networks:
mynet:
如果您仅使用普通的Docker,则可以使用--alias
命令的docker network connect
标志执行the equivalent(请参阅doc:容器联网/ IP地址和主机名)。