只是为了扩展这一点,正如您提到的那样,使用烧瓶应用程序配置,您可以设置所有内容,除非设置SESSION_COOKIE_SAMESITE=None
Google Chrome 似乎没有将值设置为“无”,然后默认为“Lax”。
我解决此问题的方法是将 cookie 添加回响应标头中。首先,我必须获取 cookie 值,因为 usingrequest.cookies.get("my_cookie")
似乎没有从响应中提取 cookie 值,并且始终显示为 None。
其次,使用response.set_cookie()
仍然不会设置samesite=None
值。我不知道为什么,因为我使用的是最新版本,flask
并且Werkzeug
显然应该可以解决问题,但事实并非如此。经过大量测试,我发现使用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 阻止的似乎被忽略了。因此,使用烧瓶应用程序验证会话并允许访问。