Python 会话 SAMESITE=None 未设置

2023-11-26

我在使用 chrome 和 SameSite 时遇到问题。我在 Shopify iframe 中提供网页,当使用 Flask-login 设置会话时,chrome 告诉我:

与跨站点资源关联的 cookie URL 设置时没有SameSite属性。它被阻止了,因为 Chrome 现在只提供 带有跨站点请求的 cookie(如果设置了)SameSite=None and Secure.

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

我尝试设置

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

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

(我有最新版本的flask、flask-login、flask-security和werkzeug)

你能帮助我吗?

谢谢


只是为了扩展这一点,正如您所提到的,使用 Flask 应用程序配置,您可以设置除设置之外的所有内容SESSION_COOKIE_SAMESITE=NoneGoogle Chrome 似乎没有将该值设置为“None”,默认为“Lax”。

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

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

from flask import session
from flask.sessions import SecureCookieSessionInterface

# where `app` is your Flask Application name.
session_cookie = SecureCookieSessionInterface().get_signing_serializer(app)

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

@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 应用程序进行验证并允许访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 会话 SAMESITE=None 未设置 的相关文章

随机推荐