Как явно установить 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
    )
Другие вопросы по тегам