Как явно установить samesite = None в ответе колбы - PullRequest
2 голосов
/ 01 июля 2019

В связи с изменениями, поступившими в Chrome в июле, мне нужно изменить свое приложение, чтобы явно указать значение ключа SameSite = None. Это связано с тем, что RFC рассматривает отсутствие этого параметра более влиятельным образом, чем если бы он присутствовал, но был установлен на None.

Однако в методе set_cookie для параметра samesite по умолчанию используется значение None, что приводит к тому, что он не записывается в set-cookie. Как я могу форсировать это в ответной части set-cookie?

Когда я пытаюсь установить тот же сайт = Нет с помощью следующего кода

resp.set_cookie('abcid', 'Hello', domain=request_data.domain, path='/', samesite=None, max_age=63072000) 

Это не показывает детали SameSite в возвращенном файле cookie набора

abcid = Привет; Домен = .localhost; Истекает = вторник, 29 июня, 2021, 22:34:02 по Гринвичу; Max-Age = 63072000; Path = /

И если я попытаюсь явно установить значение Лакса (которое является одним из принятых значений для 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 = Лакс

Я пробовал «Нет», «Нет» и «», но они либо вызывают сбой приложения, либо пропускают SameSite в полученном ответе.

Любая помощь будет принята с благодарностью

1 Ответ

1 голос
/ 05 июля 2019

Однажды исправление этой проблемы выпущен, вы сможете использовать 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
...