Set-CookieはChromeとDolphinでは機能しません-2つのWebサイトで

Aug 22 2020

この質問 と8か月前の回答をご覧ください。答えはしばらくの間問題を修正しました、しかし今日私はログインとログアウトが私のウェブサイト(ドメイン)のそれぞれ、ChromeとDolphinで別々に再び働くことを発見しました。ただし、Firefox、Edge、Operaではすべてが以前と同じように機能します。他のドメイン名からのCookieに関して、これらのブラウザで何か変更がありましたか?ログインとログアウトが両方のWebサイトで同時に機能するように修正するにはどうすればよいですか?

ユーザーは1つのWebサイトにログイン、ログアウト、またはサインアップします。他のWebサイトからも自動的にログインまたはログアウトしてほしいのですが、Firefox、Edge、Operaで動作します。ただし、ChromeとDolphinのユーザーは、現在、一方のWebサイトにログインまたはログアウトしても、もう一方のWebサイトには影響しません。

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
        }
    });
};

次に、この関数を2回呼び出す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ブラウザの最近の変更によるものだと思います。

チェックしたところ、コンソールから次のエラーが表示されました。

次のリンクに関連しているようです。

  • CookieのデフォルトはSameSite = Laxです
  • 安全でないSameSiteを拒否= Cookieなし

回答

1 aaron Aug 22 2020 at 17:55

cookie ...が `SameSite`属性なしで設定されました。

7月14日(2020年)から、これらの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. CookieのデフォルトはSameSite = Lax-Chromeプラットフォームのステータス
  2. 安全でないSameSiteを拒否= Cookieなし-Chromeプラットフォームのステータス
  3. 設定| Djangoのドキュメント| Django #std:setting-SESSION_COOKIE_SAMESITE
  4. SameSite Cookieフラグを「なし」に設定できます・プルリクエスト#11894・django / django