Apache反向代理背后的密钥斗篷

Gog*_*ogi 8 reverse-proxy keycloak

我在Google上冲浪时未找到任何具体答案或示例,因此请在这里再次尝试运气(通常会很幸运)。

问题

  • 我在apache反向代理后面运行着一个单一的spring boot RESTful服务。此RESTful服务仅运行HTTP。假设它在本地ip 172.s端口8080上运行。

  • 我还配置了一个Apache反向代理。假设它在本地IP 172.a和公共IP 55.a上运行。该代理同时响应两个端口80,但是所有HTTP通信都会自动重定向到443。

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

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

  • 使用Spring Boot Keycloak适配器将RESTful服务配置为仅承载,而将前端应用程序配置为公共访问类型。

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

在前端keycloak.json文件中,将auth-server-url设置为代理url https://example.com/auth,前端就能成功获取有效令牌。现在,当我尝试使用RESTful服务时,我在RESTful适配器中收到错误消息,令牌发行者无效。当然,在http标头中,我正在发送Authorization: Bearer <token>。我收到此错误的原因是,在RESTful keycloak配置中,我已配置,auth-server-url以使用本地url http://172.k:9080/auth,因此此url与令牌中的url不同(即https://example.com/auth)。

我不能auth-server-url在RESTful服务中包括与前端相同的内容,因为这将要求我也在RESTful服务上设置HTTP(因为url为https),这会使事情变得非常复杂,包括需要设置证书和像这样的东西。另外,我认为在仅本地服务器上设置SSL效率不高且不切实际。

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

之前有一个用于后端的不同URL,已被删除:https : //issues.jboss.org/browse/KEYCLOAK-2623

ntg*_*ntg 6

您需要告知 keycloak 反向代理的位置。然后在其响应中它将设置位置到那里而不是其本地地址。要在最新的 keycloak 中做到这一点,请将环境变量设置KEYCLOAK_FRONTEND_URL为指向字符串https://example.com/auth(是的,它需要整个地址。为了使其工作,还应设置PROXY_ADDRESS_FORWARDING为值true

如果是 Docker 容器,则意味着:

environment:
  ...
  PROXY_ADDRESS_FORWARDING: "true"
  KEYCLOAK_FRONTEND_URL: "https://example.com/auth"
Run Code Online (Sandbox Code Playgroud)

或者,您可以设置KEYCLOAK_HOSTNAMEexample.com,这将留下端口号,对于哪个???(还不知道如何执行这部分,如果您发现请告诉我...))

编辑:请注意,在某些情况下,您可能只想为特定客户端设置此项。从 keycloak 内部配置每个客户端时,您可以从第一个选项选项卡设置其 Frontend_URL。


Gog*_*ogi 3

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

唯一的缺点是我的后端服务适配器通过网络与 keycloak 进行通信,这可能不是很好的性能,但至少一切都按预期工作。应该可以以某种方式在同一本地网络或 AWS 中的同一 VPN 内指定本地 keycloak 端点。