由于 7 月份 Chrome 发生了变化,我需要修改我的应用程序以显式提供 SameSite=None 键值。 这是因为 RFC 以比存在但设置为“无”时更具影响力的方式处理此设置的缺失。
但是在 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;过期=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;过期=2021 年 6 月 29 日星期二 23:03:10 GMT;最大年龄=63072000;路径=/; SameSite=宽松
我尝试过“无”、“无”和“”,但这些要么使应用程序崩溃,要么在结果响应中忽略 SameSite。
如有任何帮助,我们将不胜感激
一旦解决此问题是 发布后,您将可以使用
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
您还可以使用以下代码设置cookies
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
)
下次在网络搜索中出现时进行回答。
就这样做:
resp.set_cookie('abcid', 'Hello', domain=request_data.domain, path='/', samesite='None', max_age=63072000)
需要提供一个字符串,并将该字符串设置为文字“None”。