是否可以告诉 Spring Boot Keycloak 适配器 Keycloak 服务器可能有多个别名?

Is it possible to tell Spring Boot Keycloak adapter that the Keycloak server may have multiple aliases?

我正在两个不同的 docker 容器中部署 Keycloak 和 Spring 启动应用程序,并且 Keycloak 正在保护应用程序。

问题是用户通过浏览器登录,所以他们在 localhost:8080 这样的地址上看到 Keycloak 服务器,而 Spring 启动应用程序在 运行它旁边有一个 docker 容器,因此可以在 keycloak_service.

这样的主机上看到该服务

Spring 启动应用程序从 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 解决方案,但我不禁觉得这不应该是一个难题。我不可能是唯一一个 运行 spring 引导应用程序和容器中的 Keycloak 实例。我原以为自然的解决方案是告诉 Spring Boot 它可以在 keycloak_service 上与 keycloak 对话,但是同一个 Keycloak 实例也被某些客户端称为 localhost:8080,它应该也接受由它签名的令牌。这可能吗?如果不行,这个问题还有其他正常的解决办法吗?

您的问题是您需要让 Keycloak 可以在外部正确访问,而不仅仅是在服务器本身内部。像 keycloak_service 这样的 docker 容器 ID 对内部服务通信是有效的,但是这里你有浏览器请求 url,所以没有必要使用它。

对于我的具体案例,我为此作业配置了一个 nginx 代理,为服务器分配了两个名称,但代理转发到我感兴趣的端口。

例如,假设您调用服务器 myapp.comauth.myapp.com。然后假设您为您的 keycloak 服务器发布端口 8080,为您的应用程序发布端口 8081。您需要以这种方式配置 nginx:

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;
  }
}

之后,您将客户端设置为使用 auth.myapp.com。另外不要忘记将 keycloak 配置为 work behind a proxy(您可能需要使用正确的配置重建 docker 图像)。

另请参阅:

  • route different proxy based on subdomain request in nginx

因为我没有添加评论的声誉,所以我要这样做。

我有一个与@Xtreme Biker 上面描述的类似设置,但我的应用程序仍然无法使用 nginx 配置中配置的 server_name 与 keycloak 通信。我可以从我的浏览器调用 myapp.com 然后重定向到 auth.myapp.com (keycloak) 进行登录。成功登录后,keycloak 使用有效的 authorization_code 重定向回 myapp.com(正如我在调试时看到的那样)。然后 myapp.com 尝试通过调用 http://auth.myapp.com/auth/realms/my-relam/protocol/openid-connect/token 来交换 authorization_code 但它无法连接并失败:java.net.ConnectException: Connection refused (Connection refused)

遇到类似问题的任何人都找到了解决方案吗?