Set-Cookie non funziona in Chrome e Dolphin, con due siti web

Aug 22 2020

Si prega di consultare questa domanda e risposta di 8 mesi fa. La risposta ha risolto il problema per un po ', ma oggi ho scoperto che login e logout funzionano di nuovo separatamente per ciascuno dei miei siti web (domini), in Chrome e in Dolphin. Ma tutto funziona come prima in Firefox, Edge e Opera. Qualcosa è cambiato in quei browser per quanto riguarda i cookie di altri nomi di dominio e come posso correggerlo in modo che il login e il logout funzionino simultaneamente in entrambi i siti web?

Gli utenti accedono o si disconnettono o si registrano a un sito Web e voglio che accedano o si disconnettano anche dall'altro sito Web, automaticamente, e funziona con Firefox, Edge e Opera. Ma gli utenti di Chrome e Dolphin, attualmente se accedono o si disconnettono a un sito Web, ciò non influisce sull'altro sito Web.

Il codice di visualizzazione 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

E il codice JavaScript è:

window.speedy = {};

window.speedy.setSession = function (domain, key) {
    $.ajax({
        url: '//' + domain + '/set-session/',
        method: 'post',
        data: {
            key: key
        },
        xhrFields: {
            withCredentials: true
        }
    });
};

Poi c'è un codice JavaScript che chiama questa funzione due volte:

speedy.setSession('speedy.net', 'session_key');
speedy.setSession('speedymatch.com', 'session_key');

Dove 'session_key'è sostituito dalla chiave di sessione dell'utente.

E le impostazioni Django (con Django 3.0.6):

SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = None

CSRF_COOKIE_SECURE = True
CSRF_COOKIE_SAMESITE = 'Strict'

C'è qualche soluzione a questo problema? Penso che ciò sia dovuto ai recenti cambiamenti nei browser Chrome e Dolphin.

Ho controllato e ottengo i seguenti errori dalla console:

Sembra correlato ai seguenti link:

  • L'impostazione predefinita dei cookie è SameSite = Lax
  • Rifiuta non sicuro SameSite = Nessuno cookie

Risposte

1 aaron Aug 22 2020 at 17:55

Un cookie ... è stato impostato senza l'attributo "SameSite".

A partire dal 14 luglio (2020), dovresti impostare questi 1,2 e aggiornare a Django 3.1 3,4 (rilasciato il 4 agosto):

SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'None'

Spiegazione

Prima di Django 3.1, l' samesiteattributo non è impostato se l'impostazione è il Nonesingleton:

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

A partire da Django 3.1, l' samesiteattributo è impostato per la 'None'stringa; ancora non per 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

Riferimenti

  1. L'impostazione predefinita dei cookie è SameSite = Lax - Chrome Platform Status
  2. Rifiuta i cookie non sicuri SameSite = Nessuno - Stato della piattaforma Chrome
  3. Impostazioni | Documentazione Django | Django #std: setting-SESSION_COOKIE_SAMESITE
  4. L'impostazione consentita dei cookie dello stesso sito viene contrassegnata su "Nessuno" · Richiesta di pull # 11894 · django / django