无法使用Safari上的Storage Access API在iframe中设置Cookie


9

我的页面上有一个iframe。由于Safari阻止了第三方Cookie,我正在尝试使用“开发人员指南”中此处建议的存储访问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>

浏览器控制台输出:

[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie: 

如您所见,授予似乎很成功,但仍然无法设置Cookie。有人知道出什么事了吗?

Safari版本13.0.1

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

[Log] hasAccess: false
[Log] error

注意:iframe附页是src指向该页的简单标签。


1
我有同样的问题。存储访问似乎可以访问现有的cookie,但不会存储任何新的cookie。这适用于使用“ document.cookie”以及“ Set-Cookie”标头中返回的新cookie。该文档似乎说它应该工作,但是没有。
Matt Cosentino

使用Safari 13.1时,该请求被拒绝,但我不明白为什么。
lunr

1
是的,这确实令人沮丧。BTW Safari 13.1开始表现相同,似乎可以访问,但设置cookie失败。
lunr

本文所述,有一些规则可以授予访问权限。并且,不应该console.log('Now we have first-party storage access!');加入thenof requestStorageAccess()吗?
Supun Kavinda

@SupunKavinda前三个规则在这里不适用。我不完全理解规则5。也许它是指已将域列入黑名单的其他机制。我也不认为这适用,但是我将尝试一些方法以查看是否相关。
lunr

Answers:


3

TL; DR

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


该代码示例有两点要注意。请注意,以下内容已在Safari 13.1上进行了测试。

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

  1. document.requestStorageAccess必须由于用户操作而被调用。尽管如MDN docs上所述,document.hasStorageAccess但似乎并未传播用户操作。
  2. 用户必须已经在第一方上下文中与第三方进行了交互。单击文档即可。

能够编写Cookie的条件:

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


Cookies会考虑这些条件。但是看来您每次都必须请求访问权限,因此我们暂时无法使用。也许我们还在做其他错误的事情。无论如何,我们决定以不同的方式进行。谢谢。
lunr

@lunr您可以分享结果吗?
Sergey Korzhov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.