我将 Spring Security 与 Keycloak 一起使用,并在我的属性中进行以下配置:
spring.security.oauth2.client.provider.keycloak.issuer-uri = http://a.com/auth/realms/arealm
协议部分是
http
我的密钥斗篷公开驻留在
https://a.com/auth/realms/arealm
,其中协议部分是https
我的 keycloak 使用以下选项启动:
command:
- start
- --optimized
- --http-enabled=true
- --proxy-headers
- forwarded
- --hostname
- https://a.com/auth/
- --hostname-backchannel-dynamic=true
在我的设置中,keycloak 和我的应用程序位于同一本地网络上,并且 https 由 keycloak 和我的应用程序前面的负载均衡器终止。如果我从我的应用程序调用以下网址,我可以成功获得响应:
curl http://a.com/auth/realms/arealm/.well-known/openid-configuration
所以我猜反向通道配置有效并且网络相关部分没问题。
但是 Spring Security 仍在抱怨并给我错误:
配置元数据中提供的发行者 https://a.com/auth/realms/arealm 与请求的发行者不匹配 http://a.com/auth/realms/arealm
我不想将 Spring 属性中的 url 更改为
https
,因为那样我就必须以某种方式强制我的应用程序通过互联网到达 keycloak,以便该请求通过负载均衡器并且 https 被终止。我通过使用我的公共 IP 地址在 /etc/hosts
中明确添加一行来做到这一点,但这是一个丑陋的解决方案,但它有效:
1.2.3.4a.com
如何阻止 Spring Security 抱怨颁发者 uri 不匹配?
如何阻止 Spring Security 抱怨颁发者 uri 不匹配?
你不能。 OpenID 规范要求发现端点负载和令牌声明中的发行者标识符完全匹配(包括方案和可选的尾部斜杠)。