web-dev-qa-db-fra.com

Comment définir explicitement samesite = None sur une réponse flask

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

9
Mark Ruse

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
4
rowan_m

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
    )
1
tilalis