反向代理后面的非标准端口上的 SAML2 服务提供商

SAML2 Service Provider on non standard port behind a reverse proxy

我有一个 SAML2 服务提供商(Open edX Platform if it makes a difference), configured according to docs and otherwise working normally. It runs at http://lms.local:8000 and works just fine with TestShib 测试身份提供商和其他第 3 方提供商。

引入nginx反向代理后问题就开始了。设置如下:

  1. nginx,显然,运行s 在端口 80
  2. LMS(服务提供商)运行端口 8000
  3. lms.local 通过主机文件
  4. 别名为 localhost

Nginx 具有以下站点配置:

server {
    listen 80;

    server_name lms.local;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;

        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }
}

问题如下:python-social-auth 检测到 lms.local:8000 上的服务器 运行(通过 request.META['HTTP_PORT'])。因此,如果尝试通过 nginx 代理使用 SAML SSO,则会失败并显示以下消息:

Authentication failed: SAML login failed: ['invalid_response'] (The response was received at http://lms.local:8000/auth/complete/tpa-saml/ instead of http://lms.local/auth/complete/tpa-saml/)

如果有帮助,会在 python-saml.OneLogin_Saml2_Response.is_valid 中抛出导致此消息的异常。

问题是:是否有可能 运行 SP 在同一域的反向代理后面,但在不同的端口? Shibboleth wiki 说它是 totally possible 到 运行 不同域上反向代理背后的 SP,但对端口只字未提。

在这种特殊情况下,反向代理发送 X-Forwarded-HostX-Forwarded-Port headers,所以我只是修改了 Django 策略以使用这些值而不是 Django 提供的值(即 request.get_hostrequest.META['SERVER_PORT']),这产生了两个拉取请求: