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
相关产品推荐
相关产品推荐

