首页 > 解决方案 > 与 DJango Simple SSO 一起使用的 CORS 问题

问题描述

我正在使用Django Simple SSO的一个分支作为服务器上的身份验证机制。当我们使用“标准”方式登录服务器时,它工作得很好。这意味着,我们只需访问 /login 路径,登录,然后浏览受限路径等。

当我们想要连接到第三台服务器时,问题就出现了,该服务器也通过 javascript/AJAX 中继 SSO 身份验证,而无需先直接访问 /login 路径。

我尝试使用 django-cors-headers 但没有得到预期的结果。我快要放弃了,所以欢迎任何帮助。

问题

假设我们在服务器 1 和身份验证服务器上登录,并且我们想要服务器 2 上的资源 在此处输入图像描述

当浏览器被重定向到身份验证服务器以验证浏览器是否使用有效用户登录时,cookie不会传输标头。(有关 Django 简单 SSO 工作原理的更多详细信息,请参见按钮图)

auth-server预检请求上设置的标头如下:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept-encoding, accept, authorization, cookie, content-type, dnt, origin, user-agent, x-csrftoken, x-grafana-org-id, x-dashboard-id, x-panel-id, x-requested-with
Access-Control-Allow-Methods: DELETE, GET, OPTIONS, PATCH, POST, PUT
Access-Control-Allow-Origin: https://server1-domain
Access-Control-Max-Age: 86400
Connection: keep-alive
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Fri, 16 Jul 2021 12:14:54 GMT
Server: nginx
Vary: Origin

GET 请求的标头包含以下内容:

请求/客户

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Host: auth-server-domain
Origin: https://server1-domain
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
x-grafana-org-id: 1

响应/认证服务器

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://server1-domain
Connection: keep-alive
Content-Language: es
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Fri, 16 Jul 2021 12:14:54 GMT
Location: /error_unauthorized_page
Referrer-Policy: same-origin
Server: nginx
Vary: Accept-Language, Cookie, Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

我认为所有标题都是正确的,但显然存在一些错误。在 cookie 方面,我尝试使用该SingleSite属性,将其设置为None并且Lax没有任何更改。从我的角度来看,cookie 浏览器内存上设置的域是“正确的” .auth-server-domain(注意点)。

我使用 DJango 3.2.5 和 Google Chrome 作为网络浏览器。如果您知道为什么没有在 auth-server-domain cors 请求上发送 cookie,我将非常感谢您的评论。

如果您认为我遗漏了任何相关信息,请随时提问!感谢大家达到这一点并帮助我!


附录:

简单 SSO 工作原理的简化架构: Django 简单 SSO 工作流程

标签: djangocorssingle-sign-oncross-domaindjango-cors-headers

解决方案


推荐阅读