因为Keycloak默认登录重定向导致混合内容错误

9

所需信息:

我正在一个Spring项目中使用Keycloak(Docker版本)。

(此项目的客户端是React,并且客户端和后端之间的通信由REST服务提供。)

客户端已经被安全保护,使用“https”协议。

以下是我的Spring配置:

  keycloak:
     auth-server-url: https://sso-ssoha.b9ad.pro-us-east-1.openshiftapps.com/auth
     realm: master
     resource: clientname
     public-client: true

问题的根源:

当我从客户端点击链接时,它通常会调用Spring服务。但在此之前,它会将当前的“https” url 添加路径sso/login,并将方案更改为“http”,然后重定向到Keycloak的默认登录页面。

但是,从https重定向到http会导致以下问题:

Mixed Content: The page at 'https://www.helpful.army/contents/Problem' was loaded over HTTPS, but requested an insecure resource 'http://serviceha-helpfularmy.b9ad.pro-us-east-1.openshiftapps.com/sso/login'. This request has been blocked; the content must be served over HTTPS.

你们在通往Keycloak的路上有反向代理吗?它是否正确设置了X-Forwarded-Proto?我们遇到了这个问题,但我不记得当时我们遇到了什么错误,也不知道你们的情况是否相似... - 9ilsdx 9rvj 0lo
我认为你说得对。因为,在客户端,React运行在NGINX上,默认的服务器配置如下所示: events { worker_connections 1024; }http { include /etc/nginx/mime.types; server { listen 3000; server_name www.helpful.army; root /usr/share/nginx/html; location / { try_files $uri /index.html; } location ~ \.css { add_header Content-Type text/css; } location ~ \.js { add_header Content-Type application/x-javascript; } }} - Altay Hunoğlu
好的,9ilsdx,有了你的帮助我解决了它。写下了解决方案。谢谢。 - Altay Hunoğlu
6个回答

5

2
在新版的Keycloak中,您可以使用值为“passthrough”的proxy设置进行配置。在Docker的情况下,您需要通过环境变量KC_PROXY=passthrough来传递此设置(keycloak配置文档)。

1
你是在表示感谢还是在稍有不同的 KC_PROXY != proxy 中有相关的其他贡献?如果是后者,请解释它的相关性和影响。 - Yunnosch
“proxy”是配置文件的设置,但也可以通过在环境变量前缀为“KC_”来提供。Keycloak config doc(我不允许对exody的答案进行评论) - Boris
解释清楚了你的帖子中确实有贡献。请进行[编辑]以使其更加明显。尽量提供[答案]。否则,如果您想在没有评论特权的情况下发表评论,请不要这样做。特别是不要滥用回答帖子来规避缺乏评论特权的限制。 - Yunnosch
请再次[编辑]以保留您正在构建的答案的参考,并给予应有的荣誉。 - Yunnosch

1

当我迁移到Keycloak X时,遇到了同样的问题。从Keycloak 17开始,不再有PROXY_ADDRESS_FORWARDING设置。对于我来说,设置proxy=passthrough有所帮助。更多详情请查看https://www.keycloak.org/server/all-config


1

我已经用以下步骤解决了这个问题以及类似的问题:

(1) 前端部分:

你知道,www.helpful.army 是一个教育项目,它的界面运行在 React 上,而且它是在 NGINX 服务器上运行的。 所以,我在默认的 NGINX 服务器配置中添加了必要的头信息:

location / {
        try_files $uri /index.html;
        proxy_set_header X-Forwarded-Proto $scheme;
        **add_header Access-Control-Allow-Origin *;**

    }

(2) 后端部分:

我在Keycloak上创建了一个不同的客户端,专门用于Spring-Boot后端,并将其设置为“仅承载者”。

keycloak:
 auth-server-url: https://sso-ssoha.b9ad.pro-us-east-1.openshiftapps.com/auth
 realm: master
 resource: serviceha
 bearer-only: true
 ssl-required: "external"
 confidential-port: 0
 verify-token-audience: true

我还在application.yml中添加了这个配置:

 server:
    port: 8443
    remote_ip_header: x-forwarded-for
    protocol_header: x-forwarded-proto
    use-forward-headers: true

(3) 我已将所有接口端口从接口更改为后端端口8443


0

如果你和我一样是Keycloak的新手,我发现解决这个错误最简单的方法是:

  1. 进入 管理控制台 -> 领域设置 -> 常规 -> 前端URL
  2. 设置 https://my.keycloak.domain/auth

检查时不要忘记清除缓存。

我在这里找到了这个解决方案。


如果由于混合内容错误而无法访问管理控制台,您该如何进入管理控制台呢? - undefined

0
Keycloak在设置反向代理方面有文档https://www.keycloak.org/server/reverseproxy
其中,他们解释道:
默认情况下,管理控制台的URL仅基于请求来解析正确的协议、主机名和端口。例如,如果您使用边缘代理模式且代理配置错误,来自TLS终止代理的后端请求将使用纯HTTP,并且可能导致无法访问管理控制台,因为URL将使用http协议创建,而代理不支持纯HTTP。
为了正确公开管理控制台,您应确保代理设置了在此处提到的X-Forwarded-*头,以便使用代理公开的协议、主机名和端口创建URL。
主要要点如下:
- 使用KC_PROXY=edge - 确保反向代理发送X-Forwarded-*头部

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接