Как явно установить samesite=None в ответе колбы
В связи с изменениями, поступающими в Chrome в июле, мне нужно изменить свое приложение, чтобы явно указать значение ключа SameSite=None. Это связано с тем, что RFC рассматривает отсутствие этого параметра более влиятельным образом, чем если бы он присутствовал, но был установлен на None.
Однако в методе set_cookie для параметра samesite по умолчанию используется значение None, что приводит к тому, что он не записывается в файл cookie set. Как я могу форсировать это в части ответа файла cookie?
Когда я пытаюсь установить тот же сайт = None с помощью следующего кода
resp.set_cookie('abcid', 'Hello', domain=request_data.domain, path='/', samesite=None, max_age=63072000)
Это не показывает детали SameSite в возвращенном файле cookie
abcid = Hello; Домен =.localhost; Истекает = вторник, 29 июня, 2021, 22:34:02 по Гринвичу; Max-Age = 63072000; Path = /
И если я попытаюсь и явно установить значение Lax (которое является одним из принятых значений для rfc) как
resp.set_cookie('abcid', "Hello", domain=request_data.domain, path='/', samesite="Lax", max_age=63072000)
Я возвращаю set-cookie, который явно имеет настройку SameSite = Lax
abcid = Hello; Домен =.localhost; Истекает = Вт, 29 июня-2021 23:03:10 GMT; Max-Age=63072000; Path=/; SameSite=Lax
Я пробовал None, "None" и "", но они либо приводят к аварийному завершению приложения, либо пропускают SameSite в полученном ответе.
Любая помощь будет принята с благодарностью
1 ответ
Как только исправление этой проблемы будет выпущено, вы сможете использовать set_cookie()
нравится:
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
Пока вы ждете релиза, вы все равно можете установить заголовок явно:
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
Вы также можете использовать следующий код для установки файлов cookie с помощью SameSite=None
пока исправление не будет выпущено
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
)