无法使用 Safari 上的存储访问 API 在 iframe 中设置 cookie

lun*_*unr 13 javascript safari iframe storage-access-api

我的页面上有一个 iframe。由于 Safari 阻止了 3rd 方 cookie,我正在尝试按照“开发人员指南”中的建议使用 Storage Access API:https : //webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . 我从文档中复制了以下代码:

<script type="text/javascript">
  window.addEventListener('load', () => {
    document.getElementById('test-button').addEventListener('click', () => {
      document.hasStorageAccess().then(hasAccess => {
        console.log('hasAccess: ' + hasAccess);
        if (!hasAccess) {
          return document.requestStorageAccess();
        }
      }).then(_ => {
        console.log('Now we have first-party storage access!');
        document.cookie = "foo=bar";
        console.log(`document.cookie: ${document.cookie}`);
      }).catch(_ => {
        console.log('error');
      });
    });
  });
</script>

<button id="test-button">Test</button>
Run Code Online (Sandbox Code Playgroud)

浏览器控制台输出:

[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie: 
Run Code Online (Sandbox Code Playgroud)

如您所见,授权似乎成功,但仍然无法设置 cookie。有谁知道出了什么问题?

Safari 版本 13.0.1

编辑: Safari 13.1 上的控制台输出:

[Log] hasAccess: false
[Log] error
Run Code Online (Sandbox Code Playgroud)

注意:封闭页面是iframe一个src指向此页面的简单标记。

hap*_*ack 5

TL; 博士

确保已经在第一方上下文中为域设置了 cookie。


该代码示例有几件事情需要注意。请注意以下内容已在 Safari 13.1 上测试。

用户提示的条件以及随后的访问权限:

  1. document.requestStorageAccess必须作为用户操作的结果被调用。尽管如MDN 文档中所述document.hasStorageAccess但似乎并未传播用户操作。
  2. 用户必须已经在第一方上下文中与第三方进行了交互。对文档的任何点击都可以。

能够写入cookie的条件:

cookie 必须已经在第一方上下文中的域上设置。这个 cookie 可以由服务器设置为响应头,也可以由 JS 使用 document.cookie 设置。通过一些进一步的测试,似乎不能使用域标志设置此 cookie,以便在第三方上下文中设置后续 cookie。这意味着实际上,现有的 cookie 也必须设置在同一个确切的子域上。

  • 我无法真正确定 Safaris StorageAccessAPI 的实现或文档是否更糟糕。至少两者都是垃圾。这是显而易见的。 (3认同)