2017-02-20 92 views
3

我已经通过谷歌没有发现任何具体的答案例子,所以在这里再次尝试我的运气(通常很幸运)冲浪。Keycloak背后的Apache反向代理

问题

  • 我背后有一个Apache 反向代理运行单个弹簧引导RESTful服务。这个RESTful服务仅运行HTTP。假设它运行在 本地ip 172.s端口8080.

  • 我也配置了一个apache反向代理。假设它运行在 本地ip 172.a和公共ip 55.a.此代理对端口80响应,但所有HTTP通信都自动重定向到443.

  • 我有另一台运行独立Keycloak服务器的服务器。此外, 此服务器配置为可通过 反向代理公开访问。说它在本地IP 172.k上运行。此Keycloak服务器仅在HTTP上运行。 HTTP请求通过反向代理使用SSL进行处理。

  • 最后,我有另一个前端webapp运行本地IP 172.f.这个前端webapp在Nodejs下运行,并且也通过反向代理进行配置。它也只运行HTTP,但客户端(浏览器)通过反向代理使用SSL,就像Keycloak和RESTful服务一样。此前端正在使用RESTful服务,并且还配置为使用keycloak javascript适配器进行身份验证。

  • 将REST风格的服务配置为仅使用Spring Boot Keyak适配器的承载,而前端应用配置为访问类型为public。

RESTful服务服务器,Keycloak服务器和前端服务器不是公共可访问的;它们只能通过反向代理访问。但他们可以相互沟通(因为他们在同一个专用网络中)。

在前端keycloak.json文件中,将auth-server-url设置为代理url https://example.com/auth,并且前端能够成功获取有效的令牌。现在,当我尝试使用RESTful服务时,在令牌发行者无效的RESTful适配器中出现错误。在http头中,我当然会发送Authorization: Bearer <token>。我得到这个错误的原因是,在REST风格的keycolak配置中,我配置了auth-server-url以使用本地url http://172.k:9080/auth,所以这个url与令牌中的url不同(它是https://example.com/auth)。

问题

我不能包括相同的RESTful服务作为前端auth-server-url,因为这将需要我还设置HTTPS协议的RESTful服务(因为那个URL的HTTPS),这将很多东西都变得复杂,包括需要设置证书和类似的东西。另外我认为在本地服务器上设置SSL效率不高并且不实用。

所以我的问题是我如何使适配器与Keycloak对话而无需通过反向代理。我希望RESTful适配器通过auth-server-url: http://172.k:9080/auth与Keyclok服务器进行令牌验证。

此前曾有为后端不同的URL,访问内容被删除:https://issues.jboss.org/browse/KEYCLOAK-2623

+0

您是否尝试将Web起源设置为*。如果我是对的,我通过跨域访问得到了同样的问题 – OkieOth

+0

是的我已经尝试将Web-origin设置为'*'而没有任何成功。 – Moni

回答

1

我尝试不同的东西,但未能解决问题。对我来说,似乎没有办法在后端适配器中指定auth-server-url: http://172.k:9080/auth,而前端适配器将auth-server-url:https://example.com/auth放入令牌中。所以我的解决方案是将所有的后端服务配置为auth-server-url: https://example.com/auth

这样做的唯一缺点是我的后端服务适配器通过web与keycloak进行通信,这可能不是很好的性能,但至少一切正常。本应该有可能以某种方式在同一本地网络中指定本地密钥协议端点,或者在AWS中指定相同的VPN。

+0

致读者:如果您有其他解决方案,请提供答案,我会很乐意接受我们的答案。 – Moni

1

我在Docker容器中使用Keycloak作为项目。我有同样的问题,但在本地网络(所以也许这不会是解决方案,在这种情况下,我很抱歉)。因此,这是这种情况:上

  • REST的Java web应用程序运行wildfly,在一个单一的码头工人容器
  • Keycloak在一个码头工人容器以前
  • 的Apache上本地运行在同一网络中运行的我机多克尔外,服务的角度2应用程序,用正确的配置

  • 角2应用程序的接口被指向的URL http://aaa.auth.com(我修改本地文件与主机条目127.0.0.1 aaa.auth.com)

  • 我通过主机名http://aaa.auth.com在Wildfly Docker和Keycloak Docker之间添加了一个链接,我在Java webapp适配器中使用了该主机名。
  • 两个适配器都指向同一个地址,据我知道这是一个Keycloak要求,见https://issues.jboss.org/browse/KEYCLOAK-2067

有很多从你的情况的差异(泊坞窗,HTTP VS HTTPS等),但是,为了避免通过Web进行通信REST-Keycloak,您是否尝试过修改服务器的文件主机(托管RESTful服务),将反向代理(172.a)和“example.com”的本地IP插入条目?

或者,也许你可以用私人DNS解决它?