【发布时间】:2020-04-05 11:43:23
【问题描述】:
我遇到了Set-Cookie 在 Chrome 中无法运行的问题(我没有检查其他浏览器)。它过去有效,但最近停止工作。我有两个有两个域名的网站,我需要在两个网站中设置 cookie。我在每个域名中调用一个 URL 来设置 cookie。但它不会在其他网站(我现在没有浏览的网站)上设置 cookie。
用户登录或注销或注册到一个网站,我希望他们也自动从另一个网站登录或注销。目前,如果他们登录或注销一个网站,不会影响另一个网站。
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');
其中'session_key' 替换为用户的会话密钥。
这个问题有什么解决办法吗?我认为这是由于 Chrome 最近的变化。
更新:我们有一个临时服务器,其中两个网站域都是相同注册域名的子域。在那里,Set-Cookie 工作正常。但是在生产网站中,我认为其他站点的 cookie 被 Chrome 阻止了,因为其他站点的域与用户当前正在浏览的域不同。
我检查过,其他网站的 cookie 也不适用于 Firefox 和 Dolphin。可能和我们最近升级到Django 2.1有关。
【问题讨论】:
-
尝试在您的设置模块中设置
SESSION_COOKIE_SAMESITE = None。 -
@aaron 是的,它有效!请看我的回答。
标签: javascript python django cookies