Set-Cookie non funziona in Chrome e Dolphin, con due siti web
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
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' samesite
attributo non è impostato se l'impostazione è il None
singleton:
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' samesite
attributo è 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
- L'impostazione predefinita dei cookie è SameSite = Lax - Chrome Platform Status
- Rifiuta i cookie non sicuri SameSite = Nessuno - Stato della piattaforma Chrome
- Impostazioni | Documentazione Django | Django #std: setting-SESSION_COOKIE_SAMESITE
- L'impostazione consentita dei cookie dello stesso sito viene contrassegnata su "Nessuno" · Richiesta di pull # 11894 · django / django