我已经将我的 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/"
我已经成功地告诉我的 javascript 端的 keycloak 使用/auth 进行身份验证:
{
"realm" : "local",
"auth-server-url" : "/auth",
"ssl-required" : "external",
"resource" : "client-local",
"public-client" : true
}
我已经成功登录,但是在发出服务器请求后,过滤器(
org.keycloak.jaxrs.JaxrsBearerTokenFilterImpl
来自 keycloak-jaxrs-oath-client-4.0.0.FINAL
)抛出异常:WWW-Authenticate: Bearer realm="local", error="invalid_token", error_description="Invalid token issuer. Expected 'http://keycloak:8090/auth/realms/local', but was 'http://localhost/auth/realms/local'"
我在这里缺少什么?我已经预料到,反向代理对 keycloak 来说是透明的......我也找不到将 localhost 添加到 keycloak 管理面板中的有效发行者的选项......
我怎样才能使该设置发挥作用?
最佳答案
您的代理应在代理上添加转发 header ,例如 X-Forwarded-For
, X-Forwarded-Proto
和 X-Forwarded-Host
,这将允许 keycloak 检索客户端(而不是反向代理)的原始 IP,这对于安全原因很重要。此外,Keycloak 可以检索它的主机名,因为它出现在代理之外,这应该有助于解决无效的 token 颁发者问题。
此外,您应该配置 Keycloak 以便使用代理 header ,如果您使用的是 Docker 镜像,请使用环境变量 PROXY_ADDRESS_FORWARDING=true
执行此操作。 .
看看文档 [1],你会在那里找到更多的答案。
[1] https://www.keycloak.org/docs/4.8/server_installation/#_setting-up-a-load-balancer-or-proxy
关于apache - 在代理后面运行 keycloak 时 token 颁发者无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51554178/