我在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
我将我的keycloak服务器放置在apache代理后面:
ProxyRequests On
ProxyVia On
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyCheckPeerCN on
SSLProxyCheckPeerExpire on
<LocationMatch "/auth/">
ProxyPass http://keycloak:8090/auth/ Keepalive=On
</LocationMatch>
ProxyPassReverse "/auth/" "http://keycloak:8090/auth/"
Run Code Online (Sandbox Code Playgroud)
我已经成功地告诉我在JavaScript端的密钥斗篷使用/ auth进行身份验证:
{
"realm" : "local",
"auth-server-url" : "/auth",
"ssl-required" : "external",
"resource" : "client-local",
"public-client" : true
}
Run Code Online (Sandbox Code Playgroud)
我已经成功登录,但是在发出服务器请求后,过滤器(org.keycloak.jaxrs.JaxrsBearerTokenFilterImplfrom keycloak-jaxrs-oath-client-4.0.0.FINAL)引发异常:
WWW-Authenticate:Bearer realm =“ local”,error =“ invalid_token”,error_description =“无效的令牌发行者。预期为' http:// keycloak:8090 / auth / realms / local ',但为' http:// localhost / auth / realms / local '“
我在这里想念的是什么?我期望反向代理对于密钥斗篷是透明的...我也无法在密钥斗篷管理面板中找到将本地主机添加到有效发行人的选项...
如何使该设置生效?