En raison de changements arrivés en Chrome en juillet, je dois modifier mon application pour fournir explicitement la valeur de clé SameSite = None. Cela est dû au fait que le RFC traite l'absence de ce paramètre de manière plus impactante). que s'il est présent mais réglé sur Aucun.
Cependant, sur la méthode set_cookie, le paramètre samesite est défini par défaut sur None, ce qui entraîne qu'il n'est pas écrit dans le cookie set. Comment puis-je forcer cela dans la partie set-cookie de la réponse?
Lorsque j'essaie de définir le samesite = None avec le code suivant
resp.set_cookie('abcid', 'Hello', domain=request_data.domain, path='/', samesite=None, max_age=63072000)
Cela ne montre aucun détail de SameSite dans le set-cookie renvoyé
abcid = Bonjour; Domaine = .localhost; Expire = mar, 29-juin-2021 22:34:02 GMT; Max-Age = 63072000; Chemin = /
Et si j'essaie de définir explicitement la valeur de Lax (qui est l'une des valeurs acceptées par rfc) comme suit
resp.set_cookie('abcid', "Hello", domain=request_data.domain, path='/', samesite="Lax", max_age=63072000)
Je récupère le set-cookie qui a explicitement le paramètre SameSite = Lax
abcid = Bonjour; Domaine = .localhost; Expire = mar., 29-juin-2021 23:03:10 GMT; Max-Age = 63072000; Chemin = /; SameSite = Lax
J'ai essayé None, "None" et "" mais ceux-ci plantent l'application ou omettent le SameSite dans la réponse résultante.
Toute aide serait reçue avec gratitude
Une fois le correctif de ce problème publié, vous pourrez utiliser set_cookie()
comme ceci:
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/')
def hello_world():
resp = make_response('Hello, World!');
resp.set_cookie('same-site-cookie', 'foo', samesite='Lax');
resp.set_cookie('cross-site-cookie', 'bar', samesite='Lax', secure=True);
return resp
Pendant que vous attendez la sortie, vous pouvez toujours définir l'en-tête explicitement:
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/')
def hello_world():
resp = make_response('Hello, World!');
resp.set_cookie('same-site-cookie', 'foo', samesite='Lax');
# Ensure you use "add" to not overwrite existing cookie headers
resp.headers.add('Set-Cookie','cross-site-cookie=bar; SameSite=None; Secure')
return resp
Vous pouvez également utiliser le code suivant pour définir des cookies avec SameSite=None
jusqu'à ce que le correctif soit publié
from werkzeug.http import dump_cookie
# That's a workaround for explicitly setting SameSite to None
# Until the following fix is released:
# https://github.com/pallets/werkzeug/issues/1549
def set_cookie(response, *args, **kwargs):
cookie = dump_cookie(*args, **kwargs)
if 'samesite' in kwargs and kwargs['samesite'] is None:
cookie = "{}; {}".format(cookie, b'SameSite=None'.decode('latin1'))
response.headers.add(
'Set-Cookie',
cookie
)