chrome 即使使用 samesite=None 也阻止 cookie

chrome blocking the cookies even with samesite=None

我有一个 flask 应用程序托管在 heroku 中,作为 iframe 嵌入到我的网站之一。 假设 a.com 将此 <heroku_url>.com 呈现为 iframe。 当用户访问 a.com 时,呈现 <heroku_url>.com 并创建会话。

from flask import session, make_response

@app.route("/")
def index():
    session['foo'] = 'bar'
    response = make_response("setting cookie")
    response.headers.add('Set-Cookie', 'cross-site-cookie=bar; SameSite=None; Secure')
    return response

在 Chrome 开发工具中,我看到 cookie 被阻止了。虽然在 Firefox 中工作正常。 我是否正确设置了 cookie? 我知道这是由于 chrome80 更新,但不确定解决方法

您可以通过检查位于 https://samesite-sandbox.glitch.me/

的测试站点来检查您的浏览器是否按预期处理 cookie

如果所有行都包含绿色勾号 (✔️),则 cookie 可能存在某种问题,我建议检查 DevTools 中的“问题”选项卡和“网络”选项卡以确认 set-cookie header 绝对包含它应该包含的内容。

如果测试站点上有任何红色或橙色叉号 (✘),那么您的浏览器中的某些内容正在影响 cookie。检查您是否阻止了 third-party cookies (chrome://settings/cookies) 或 运行 可能执行类似操作的扩展程序。

将会话 cookie 中的 samesite 属性设置为 None 似乎已经解决了问题。

必须更新 werkzeug(由 flask 包装的 WSGI 网络应用程序库)并更新会话 cookie。 即

app.config['SESSION_COOKIE_SAMESITE'] = 'None'
app.config['SESSION_COOKIE_SECURE'] = True

不过,这也取决于用户在'chrome://settings/cookies'中的偏好。

Chrome 将阻止会话 cookie,即使 samesite 设置为 None 如果选择以下选项之一

  • 阻止 third-party cookies
  • 阻止所有 cookie
  • 在隐身模式下阻止 third-party cookie(在隐身模式下阻止)。