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

时间:2015-09-16 15:19:01

标签: python nginx reverse-proxy saml-2.0 python-social-auth

我有一个SAML2服务提供商(Open edX Platform如果它有所作为),根据docs配置,否则正常工作。它运行在http://lms.local:8000,可以与TestShib测试身份提供商和其他第三方提供商一起使用。

引入nginx反向代理时会出现问题。设置如下:

    显然,
  1. nginx在端口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表示在不同的域上运行反向代理后面的SP是totally possible,但对端口没有任何说明。

1 个答案:

答案 0 :(得分:0)

在此特定情况下,反向代理正在发送X-Forwarded-HostX-Forwarded-Port标头,因此我只修改了django策略以使用这些值而不是Django提供的值(即request.get_host和{{1 }},它产生了两个拉取请求: