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

Posted

技术标签:

【中文标题】是否可以告诉 Spring Boot Keycloak 适配器 Keycloak 服务器可能有多个别名?【英文标题】:Is it possible to tell Spring Boot Keycloak adapter that the Keycloak server may have multiple aliases? 【发布时间】:2018-12-25 09:41:01 【问题描述】:

我正在两个不同的 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 看到 keycloak。不过,我最终需要更改这一点,因为我需要 docker 桥接网络的其他功能。

对于这个问题,我可以使用各种其他的 hacky 解决方案,但我不禁觉得这不应该是一个难题。我不能是唯一一个在容器中与 Keycloak 实例一起运行 Spring Boot 应用程序的人。我本以为自然的解决方案是告诉 Spring Boot 它可以在 keycloak_service 上与 keycloak 对话,但是对于某些客户端,相同的 Keycloak 实例也称为 localhost:8080,它也应该接受由它签名的令牌。这可能吗?如果没有,有没有其他正常的解决方法?

【问题讨论】:

【参考方案1】:

由于我没有添加 cmets 的声誉,所以我会这样做。

我有一个与上面描述的@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)

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

【讨论】:

【参考方案2】:

您的问题是您需要让 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

【讨论】:

以上是关于是否可以告诉 Spring Boot Keycloak 适配器 Keycloak 服务器可能有多个别名?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 Spring Boot 哪个主类用于可执行 jar?

在 Spring Boot 中,啥告诉应用程序使用数据库? [复制]

如何告诉 Spring Boot 忽略 Jetty 并始终使用 Tomcat?

同一台服务器上的 Spring Boot + Angular2

如何告诉 Spring Boot 使用另一个数据库进行测试?

阿里P9告诉你 Spring Boot 2.0正式发布,升还是不升呢?