dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序

Ste*_*ich 6 spring oauth-2.0 docker spring-boot keycloak

考虑以下环境:

  • 一个 docker 容器是 keycloak
  • 另一个 docker 容器是我们的 Web 应用程序,它使用 keycloak 进行身份验证

Web 应用程序是应用了“keycloak-spring-boot-starter”的 Spring Boot 应用程序。在 application.properties 中:

keycloak.auth-server-url = http://localhost:8028/auth

访问我们的 Web 应用程序的用户将使用 keycloak docker 容器的公开端口的 URL 重定向到 keycloak。登录在 keycloak 中没有问题,并且用户(浏览器)再次重定向到我们的 Web 应用程序。现在,需要将授权代码交换为访问令牌。因此,我们的 Web 应用程序(keycloak 客户端)尝试连接到keycloak.auth-server-url 中配置的相同主机和端口。但这是一个问题,因为 Web 应用程序驻留在 docker 容器中而不是主机上,因此它应该访问http://keycloak:8080keycloak是链接的 keycloak docker 容器的内容。

所以问题是:如何配置 keycloak 客户端来为浏览器重定向和访问令牌端点应用不同的 URL?

Cyr*_*lle 8

曾经有另一个属性,auth-server-url-for-backend-requests被拉取请求 #2506 删除,作为Keycloak 的 JIRA 上问题 #2623的解决方案。在此问题的描述中,您将找到原因和可能的解决方法:应该在 DNS 级别或通过向主机文件添加条目来解决该问题

因此,在客户端配置中您可以做的并不多,除非您更改代码并制作自己的适配器版本,但是您可以在 Docker 级别做一些事情。为了这个正常工作,首先,我建议你使用的不是完全限定域名localhost公共主机名,就像在生产反正,例如。keycloak.mydomain.com. 如果您只是将它添加到主机的/etc/hosts文件(或 Windows 等效文件)作为localhost.

然后,如果您使用 Docker Compose,您可以在容器所连接的 docker 网络上为 keycloak 服务设置别名(替代主机名)(请参阅文档:撰写文件参考/服务配置参考/网络/别名)。例如:

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:

Run Code Online (Sandbox Code Playgroud)

如果您只是使用普通 Docker,则可以使用命令标志执行等效操作(请参阅文档:容器网络/IP 地址和主机名)。--aliasdocker network connect