【发布时间】:2017-07-09 14:28:00
【问题描述】:
我在谷歌上冲浪没有找到任何具体答案或示例,所以再次在这里试试运气(经常走运)。
问题
我有一个 Spring Boot RESTful 服务在 Apache 后面运行 反向代理。此 RESTful 服务仅运行 HTTP。说它正在运行 本地ip 172.s 8080端口。
我还配置了一个 apache 反向代理。说它正在运行 本地 ip 172.a 和公共 ip 55.a。此代理同时响应 80 端口,但所有 HTTP 流量都自动重定向到 443。
我有另一台服务器运行独立的 Keycloak 服务器。还 此服务器配置为可通过 反向代理。假设它在本地 ip 172.k 上运行。此 Keycloak 服务器仅在 HTTP 上运行。 HTTP 请求通过反向代理使用 SSL 进行处理。
最后,我在本地 ip 172.f 上运行了另一个前端 web 应用程序。这个 frontend-webapp 在 Nodejs 下运行,也是通过反向代理配置的。它也只运行 HTTP,但客户端(浏览器)通过反向代理使用 SSL,就像 Keycloak 和 RESTful 服务一样。此前端正在使用 RESTful 服务,并且还配置为使用 keycloak javascript 适配器进行身份验证。
RESTful 服务使用 Spring Boot Keycloak 适配器配置为仅承载,而前端应用程序配置为公共访问类型。
RESTful 服务服务器、Keycloak 服务器和前端服务器不可公开访问;它们只能通过反向代理访问。但是它们可以相互通信(因为它们在同一个专用网络中)。
在前端keycloak.json文件中,auth-server-url设置为代理urlhttps://example.com/auth,前端能够成功获取到有效token。现在,当我尝试使用 RESTful 服务时,我在 RESTful 适配器中收到一个错误,即令牌颁发者无效。当然,我在 http-header 中发送Authorization: Bearer <token>。我收到此错误的原因是在 RESTful keycloak 配置中,我已将 auth-server-url 配置为使用本地 url http://172.k:9080/auth,因此此 url 与令牌中的 URL 不同(即 https://example.com/auth)。
问题
我不能在 RESTful 服务中包含与前端相同的 auth-server-url,因为这将要求我还在 RESTful 服务上设置 HTTP(因为 url 是 https),这会使事情复杂化很多,包括需要设置证书和类似的东西。另外我认为在本地服务器上设置 SSL 效率低且不实用。
所以我的问题是如何让适配器在不通过反向代理的情况下与 Keycloak 对话。我希望 RESTful 适配器通过 auth-server-url: http://172.k:9080/auth 与 Keyclok 服务器通信以进行令牌验证。
之前有一个不同的后端网址,已被删除:https://issues.jboss.org/browse/KEYCLOAK-2623
【问题讨论】:
-
您是否尝试将 Web Origins 设置为 *.如果我是对的,我通过跨域访问遇到了同样的问题
-
是的,我尝试将 Web-origins 设置为 '*',但没有成功。