首页 文章

apache反向代理背后的Keycloak

提问于
浏览
4

我已经浏览谷歌而没有找到任何 concrete 答案或 examples ,所以再次尝试我的运气(经常变得幸运) .

The problem

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

  • 我还配置了一个apache反向代理 . 假设它在本地ip 172.a和public ip 55.a上运行 . 此代理响应端口80,但所有HTTP流量自动重定向到443 .

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

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

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

RESTful服务服务器,Keycloak服务器和前端服务器不可公开访问;它们只能通过反向代理访问 . 但是他们可以相互通信(因为他们在同一个私人网络中) .

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

Question

我不能在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

2 回答

  • 1

    我正在使用Keycloak作为docker容器中的项目 . 我有同样的问题,但在本地网络(所以这可能不是解决方案,在这种情况下,我很抱歉) . 所以情况就是这样:

    • 在一个Docker容器中在wildfly上运行的REST java webapp

    • Keycloak在前一个网络中的单个Docker容器中运行

    • Apache在Docker之外的我的机器上本地运行,提供有角度的2应用程序,配置正确

    • angular 2 app的适配器指向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

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

    或者,也许您可以使用私有DNS解决它?

  • 2

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

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

相关问题