7

我遇到了 chrome 和 SameSite 的问题。我在 shopify iframe 中提供网页,当使用烧瓶登录设置会话时,chrome 告诉我:

设置了与 URL 处的跨站点资源关联的 cookie,但未设置该 SameSite属性。SameSite=None 它已被阻止,因为 Chrome 现在仅在使用和设置时才提供带有跨站点请求的 cookie Secure

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

我试过设置

app.config['SESSION_COOKIE_SAMESITE'] = "无"

我试过了,改变了库的行为,我厌倦了在 set_cookie() 中设置属性,但似乎没有任何效果。我看到的响应没有 SameSite 属性。

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

你能帮助我吗?

谢谢

4

4 回答 4

7

只是为了扩展这一点,正如您提到的那样,使用烧瓶应用程序配置,您可以设置所有内容,除非设置SESSION_COOKIE_SAMESITE=NoneGoogle 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 阻止的似乎被忽略了。因此,使用烧瓶应用程序验证会话并允许访问。

于 2020-09-22T18:36:22.037 回答
3

一个容易犯的错误(就像我一样)是None"None". 请务必使用字符串而不是 python 文字,如下所示:

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

samesite=None确实会被忽略并默认为“Lax”。

于 2021-04-14T08:59:52.177 回答
1

来自: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
于 2020-07-31T22:27:45.377 回答
0

我有一个类似的问题,它一直将 SESSION_COOKIE_SAMESITE 设置为 Lax。就我而言,这是由覆盖我的配置的烧瓶护身符引起的。指定

session_cookie_samesite=app.config["SESSION_COOKIE_SAMESITE"]

在 Talisman 构造函数中工作。

于 2022-02-09T14:00:52.370 回答