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

Superset集成EntraID OAuth2时重定向URI为HTTP而非HTTPS的问题

Superset集成EntraID OAuth2时重定向URI返回HTTP而非HTTPS的问题

我在服务器上通过虚拟环境、Gunicorn、Nginx和Apache部署Superset(服务器多数站点使用Apache),集成EntraID OAuth2时发现重定向URI返回HTTP而非预期的HTTPS。已经尝试设置ENABLE_PROXY_FIX=True,并配置过Apache和Nginx的相关请求头,但问题仍未解决。


相关配置信息

Nginx配置

server {
    listen 9999;
    server_name domain.com;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn_superset.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 注释掉这行是因为Apache已配置该请求头
        # proxy_set_header X-Forwarded-Proto https;
    }
}

Apache配置

<IfModule mod_ssl.c>
<VirtualHost *:443>
    SSLEngine on

    ServerAdmin info@example.com
    ServerName example.com

    ProxyPreserveHost On
    ProxyPass / http://localhost:9999/
    ProxyPassReverse / http://localhost:9999/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLCertificateFile 'DIRECTORY'
    SSLCertificateKeyFile 'DIRECTORY'
    Include 'DIRECTORY'

    #RequestHeader set X-Forwarded-Proto "https"
    #RequestHeader set X-Forwarded-Ssl "on"

    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff
</VirtualHost>
</IfModule>

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

Superset配置

ENABLE_PROXY_FIX=True

SQLALCHEMY_DATABASE_URI = 'DATABASE'

AUTH_TYPE = AUTH_OAUTH

OAUTH_PROVIDERS = [
    {   'name':'Alephsub0-EntraID',
        'token_key':'access_token', # access_token_url响应中的token名称
        'icon':'fa-sign-in',   # 提供者图标
        'remote_app': {
            'client_id':'ClientID',  # Superset应用的客户端ID
            'client_secret':'ClientSecret', # 对应客户端ID的密钥
            'server_metadata_url':'url/.well-known/openid-configuration',
            'client_kwargs':{
                'scope': 'User.Read'               # 授权范围
            },
        }
    }
]

# 允许用户自行注册,从授权用户创建Flask用户
AUTH_USER_REGISTRATION=True

# 默认用户注册角色
AUTH_USER_REGISTRATION_ROLE = "Public"


SESSION_COOKIE_SAMESITE='None'
SESSION_COOKIE_HTTPONLY=False
SESSION_COOKIE_SECURE=True

# 代理修复配置
PROXY_FIX_CONFIG = {
    'x_for': 1,
    'x_proto': 1,
    'x_host': 1,
    'x_port': 1,
    'x_prefix': 1
}

解决建议

  • 启用Apache的HTTPS请求头传递
    取消Apache配置中被注释的请求头设置,确保X-Forwarded-Proto和X-Forwarded-Ssl能正确传递到后端:

    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Ssl "on"
    

    同时执行a2enmod headers启用mod_headers模块,重启Apache生效。

  • 检查Nginx的proxy_params文件
    include proxy_params可能覆盖自定义请求头配置,检查该文件是否包含X-Forwarded-Proto相关设置,如有冲突,直接在Nginx的location块中明确设置:

    proxy_set_header X-Forwarded-Proto https;
    
  • 调整Superset代理修复层级
    请求经过Apache→Nginx→Gunicorn三层代理,当前PROXY_FIX_CONFIG的x_proto值为1,无法正确识别最外层协议,调整为2:

    PROXY_FIX_CONFIG = {
        'x_for': 2,
        'x_proto': 2,
        'x_host': 2,
        'x_port': 2,
        'x_prefix': 2
    }
    
  • 强制Superset使用HTTPS生成URL
    若上述方法无效,直接在Superset配置中添加:

    PREFERRED_URL_SCHEME = 'https'
    

    强制应用生成的所有URL使用HTTPS协议。

  • 验证请求头传递情况
    在Superset中添加测试视图打印请求头,确认X-Forwarded-Proto是否为https,排查请求头丢失的环节。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:07:01