Python会话SAMESITE=未设置"无"



我在chrome和SameSite方面遇到问题。我正在shopify iframe中提供一个网页,当使用flask-login设置会话时,chrome告诉我这一点:

与位于的跨站点资源关联的cookie设置URL时没有SameSite属性。它被屏蔽了,因为Chrome现在只提供带有跨站点请求的cookie(如果设置为SameSite=None(和CCD_ 3。

设置了安全,但我试图以所有可能的方式设置SameSite,但没有效果。

我试着设置

app.config['ESSION_COOKIE_SAMESITE']="无";

我尝试过,改变了库的行为,我厌倦了在set_cookie((中设置属性,但似乎什么都不起作用。我看到的响应没有SameSite属性。

(我有烧瓶、烧瓶登录、烧瓶安全和werkzeug的最新版本(

你能帮我吗?

谢谢

为了对此进行扩展,正如您所提到的,使用flask应用程序配置,您可以设置所有内容,除非设置SESSION_COOKIE_SAMESITE=NoneGoogle Chrome似乎没有将值设置为"无";,然后默认为"0";Lax";。

我解决这个问题的方法是将cookie添加回响应头中。首先,我必须获取cookie值,因为使用request.cookies.get("my_cookie")似乎不会从响应中提取cookie值,并且总是显示为None。

其次,使用response.set_cookie()仍然没有设置samesite=None的值。我不知道为什么,因为我使用的是最新版本的flaskWerkzeug,这显然应该解决问题,但它没有。经过大量测试,我发现使用response.headers.add()可以添加Set-Cookie:头,但我需要一种提取cookie值的方法来确保我可以获得相同的会话。在浏览了烧瓶文档和其他在线论坛之后。我发现我实际上可以调用SecureCookieSessionInterface类,并从那里获得签名会话。

from flask import session
from flask.sessions import SecureCookieSessionInterface
# where `app` is your Flask Application name.
session_cookie = SecureCookieSessionInterface().get_signing_serializer(app)

最后,我必须确保在请求建立后将相同的会话添加到响应中,而不是在每个路由上调用它,这在成熟的应用程序中似乎是不可行的。这是通过使用after_request装饰器来完成的,该装饰器在请求后自动运行。

@app.after_request
def cookies(response):
same_cookie = session_cookie.dumps(dict(session))
response.headers.add("Set-Cookie", f"my_cookie={same_cookie}; Secure; HttpOnly; SameSite=None; Path=/;")
return response

我在Chrome中注意到,它基本上设置了一个具有相同签名值的重复cookie。由于两者都与响应标头中有samesite=None的一个相同,而另一个被Chrome阻止似乎被忽略了。因此,使用flask应用程序验证会话,并允许访问。

一个容易犯的错误(正如我所做的(是将None"None"混淆。请确保使用字符串而不是python文字,如:

response.set_cookie("key", value, ..., samesite="None")

CCD_ 16将确实被忽略并且默认为"0";Lax";。

来源:https://github.com/GoogleChromeLabs/samesite-examples/blob/master/python-flask.md

假设您使用的是包含此问题修复程序的werkzeug的最新版本,那么您应该能够使用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='None', 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

我也遇到过类似的问题,它一直将SESSION_COOKIE_SAMESITE设置为Lax。在我的情况下,它是由烧瓶护身符引起的,他覆盖了我的配置。指定

session_cookie_samesite=app.config["SESSION_COOKIE_SAMESITE"]

在Talisman建造师工作。

最新更新