You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React前端HTTPS部署后调用HTTP Keycloak遇混合内容错误求助

解决HTTPS前端调用HTTP Keycloak的混合内容错误

问题背景

前端已迁移至HTTPS域名部署,调用HTTP协议的Keycloak服务时触发混合内容错误,本地部署无问题,根源是跨域+协议不一致导致浏览器阻止加载HTTP资源。技术栈:keycloak-js@^21.0.1,Keycloak为jboss/keycloak最新镜像。

错误信息

Mixed Content: The page at {https://frontend_page} was loaded over HTTPS, but requested an insecure frame {http:keycloak/auth/realms/master/protcol/openid-connect/3p-cookies/step1.html} This request has been blocked; the content must be served over HTTPS.

当前配置

Keycloak容器环境变量

PROXY_ADDRESS_FORWARDING=true
KC_PROXY=passthrough
KEYCLOAK_PROXY=true

NGINX配置

server {
    if ($host = {Frontend_domain}) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    location / {
            proxy_pass http://IP;
            proxy_set_header    Host               $host;
            proxy_set_header    X-Real-IP          $remote_addr;
            proxy_set_header    X-Forwarded-For    
            $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Host   $host;
            proxy_set_header    X-Forwarded-Server $host;
            proxy_set_header    X-Forwarded-Port   $server_port;
            proxy_set_header    X-Forwarded-Proto  $scheme;
        }

        listen 80 ;
        listen [::]:80 ;
    server_name {Frontend_domain};
    return 404; # managed by Certbot

}

解决步骤

1. 给Keycloak加HTTPS反向代理(核心)

浏览器禁止HTTPS页面加载HTTP资源,必须让前端通过HTTPS访问Keycloak。在现有NGINX配置里新增两个server块:

# Keycloak HTTPS代理
server {
    server_name {Keycloak_domain}; # 比如keycloak.yourdomain.com

    location / {
        proxy_pass http://{Keycloak_IP}:{Keycloak_Port}; # 指向你的Keycloak容器地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
    }

    # 用Certbot配置SSL证书
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/letsencrypt/live/{Keycloak_domain}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{Keycloak_domain}/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

# Keycloak HTTP转HTTPS重定向
server {
    if ($host = {Keycloak_domain}) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    listen [::]:80;
    server_name {Keycloak_domain};
    return 404;
}

改完NGINX后,把前端的Keycloak初始化地址改成https://{Keycloak_domain}/auth。

2. 调整Keycloak容器代理参数

当前KC_PROXY=passthrough不适合反向代理场景,换成edge模式,同时移除旧版本参数:

PROXY_ADDRESS_FORWARDING=true
KC_PROXY=edge
# 删除KEYCLOAK_PROXY=true,这个是旧版参数,新版用KC_PROXY

edge模式下,Keycloak会信任NGINX传递的X-Forwarded-Proto头部,生成HTTPS的资源链接和回调地址。

3. 修正前端Keycloak初始化配置

确保前端所有Keycloak相关URL都是HTTPS:

import Keycloak from 'keycloak-js';

const keycloak = new Keycloak({
  url: 'https://{Keycloak_domain}/auth',
  realm: 'master',
  clientId: '你的客户端ID'
});

别用HTTP地址或相对路径,避免Keycloak生成不安全的资源链接。

4. 检查Keycloak客户端配置(可选)

登录Keycloak后台,确认对应客户端的Access Type是public(前端应用默认用这个),Valid Redirect URIs和Web Origins包含前端的HTTPS域名,比如https://{Frontend_domain}/*。

内容的提问来源于stack exchange,提问作者n9p4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:35:35