我有一个SAML2服务提供商( 开放edX平台,如果有所作为 ),根据文档configuration,否则正常工作。 它运行在http://lms.local:8000上,并且可以在TestShibtesting身份提供程序和其他第三方提供程序中正常工作。
lms.local
通过主机文件别名到localhost Nginx的configuration如下:
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/)
如果这有帮助,会导致此消息的exception在python-saml.OneLogin_Saml2_Response.is_valid中抛出。
问题是:是否可以在同一个域上的反向代理之后运行SP,但在不同的端口上运行? Shibboleth维基说, 完全有可能在不同域名的反向代理之后运行一个SP,但是没有提到端口。
在这种情况下,反向代理正在发送X-Forwarded-Host
和X-Forwarded-Port
头文件,所以我只是修改了django策略来使用这些值,而不是Django提供的值(即request.get_host
和request.META['SERVER_PORT']
),这产生了两个请求: