请参阅8 个月前的这个问题 和答案。答案解决了一段时间的问题,但今天我发现登录和注销再次分别适用于我的每个网站(域),在 Chrome 和 Dolphin 中。但是,在 Firefox、Edge 和 Opera 中一切正常。这些浏览器中关于来自其他域名的 cookie 是否发生了一些变化,我该如何修复它以便登录和注销将在两个网站上同时工作?
用户登录或注销或注册到一个网站,我希望他们也自动从另一个网站登录或注销,它适用于 Firefox、Edge 和 Opera。但是 Chrome 和 Dolphin 的用户,目前如果他们登录或注销一个网站,它不会影响另一个网站。
Django 视图代码为:
@csrf_exempt
def set_session(request):
"""
Cross-domain authentication.
"""
response = HttpResponse('')
origin = request.META.get('HTTP_ORIGIN')
if isinstance(origin, bytes):
origin = origin.decode()
netloc = urlparse(origin).netloc
if isinstance(netloc, bytes):
netloc = netloc.decode()
valid_origin = any(netloc.endswith('.' + site.domain) for site in Site.objects.all().order_by("pk"))
if (not (valid_origin)):
return response
if (request.method == 'POST'):
session_key = request.POST.get('key')
SessionStore = import_module(django_settings.SESSION_ENGINE).SessionStore
if ((session_key) and (SessionStore().exists(session_key))):
# Set session cookie
request.session = SessionStore(session_key)
request.session.modified = True
else:
# Delete session cookie
request.session.flush()
response['Access-Control-Allow-Origin'] = origin
response['Access-Control-Allow-Credentials'] = 'true'
return response
JavaScript 代码是:
window.speedy = {};
window.speedy.setSession = function (domain, key) {
$.ajax({
url: '//' + domain + '/set-session/',
method: 'post',
data: {
key: key
},
xhrFields: {
withCredentials: true
}
});
};
然后有一段 JavaScript 代码调用了这个函数两次:
speedy.setSession('speedy.net', 'session_key');
speedy.setSession('speedymatch.com', 'session_key');
where'session_key'
替换为用户的会话密钥。
和 Django 设置(使用 Django 3.0.6):
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = None
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_SAMESITE = 'Strict'
这个问题有什么解决办法吗?我认为这是由于 Chrome 和 Dolphin 浏览器最近发生的变化。
我检查并从控制台收到以下错误:
它看起来与以下链接有关: