0

请参阅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 浏览器最近发生的变化。

我检查并从控制台收到以下错误:

从快速匹配 来自快速网络

它看起来与以下链接有关:

4

1 回答 1

1

一个 cookie ... 没有设置 `SameSite` 属性。

从 2020 年 7 月 14 日开始,您应该设置这些1,2并升级到 Django 3.1 3,4(8 月 4 日发布):

SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'None'

解释

在 Django 3.1 之前,samesite如果设置是单例,则不设置属性None

if samesite:
    if samesite.lower() not in ('lax', 'strict'):
        raise ValueError('samesite must be "lax" or "strict".')
    self.cookies[key]['samesite'] = samesite

从 Django 3.1 开始,该samesite属性是为'None'字符串设置的;仍然不是None/ False

if samesite:
    if samesite.lower() not in ('lax', 'none', 'strict'):
        raise ValueError('samesite must be "lax", "none", or "strict".')
    self.cookies[key]['samesite'] = samesite

参考

  1. Cookies 默认为 SameSite=Lax - Chrome 平台状态
  2. 拒绝不安全的 SameSite=None cookie - Chrome 平台状态
  3. 设置 | Django 文档 | Django #std:setting-SESSION_COOKIE_SAMESITE
  4. 允许将 SameSite cookie 标志设置为“无”·拉取请求 #11894·django/django
于 2020-08-22T17:55:22.163 回答