是否可以告诉 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.com
和 auth.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)
。
遇到类似问题的任何人都找到了解决方案吗?
我正在两个不同的 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.com
和 auth.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)
。
遇到类似问题的任何人都找到了解决方案吗?