如何在烧瓶响应中显式设置samesite = None

时间:2019-06-30 23:13:41

标签: python flask cookies samesite

由于7月份Chrome即将发布更改,因此我需要修改我的应用以显式提供SameSite = None键值。这是由于RFC以比存在但设置为None的方式更具影响力的方式对待缺少此设置的问题。

但是,在set_cookie方法上,samesite参数默认设置为None,这导致它不被写入set-cookie。如何将其强加到响应的set-cookie部分中?

当我尝试使用以下代码设置samesite = None

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

这不会在返回的set-cookie中显示任何SameSite详细信息

  

abcid =你好;域= .localhost; Expires = Tue,2021年6月29日22:34:02 GMT;最大年龄= 63072000;路径= /

如果我尝试显式设置Lax的值(这是每个rfc可接受的值之一)

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

我得到显式具有SameSite = Lax设置的set-cookie

  

abcid =你好;域= .localhost; Expires = Tue,2021年6月29日23:03:10 GMT;最大年龄= 63072000;路径= /; SameSite = Lax

我尝试了None,“ None”和“”,但是它们要么使应用程序崩溃,要么在结果响应中忽略SameSite。

将不胜感激地收到任何帮助

2 个答案:

答案 0 :(得分:1)

the fix to this issue是 发布,您将可以使用 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

在等待发布时,您仍然可以 set the header 明确地:

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

答案 1 :(得分:0)

您还可以使用以下代码通过SameSite=None设置cookie,直到发布修复程序为止

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
    )