Safari 13+ iframe阻止CORS Cookie

时间:2020-01-13 19:35:03

标签: javascript cookies iframe safari cors

Safari全面禁止您在与父域不同的域的iframe中设置cookie,这是该死的服务器端CORS标头。

要澄清:用户位于domainA.com上。 domainB.com的iframe已打开, 并尝试在domainB.com内对用户进行身份验证 iframe。 Set-Cookie标头是从domainB.com iframe内的服务器返回的,具有所有必需的标头,但Safari不会在后续调用中将其发送回去。

一个旧的解决方法是从iframe提交表单,然后在响应中设置cookie。我想他们喜欢用户单击某些内容以提交表单的事实。您必须轮询cookie以查看响应何时返回,因为表单提交没有回调,对于HttpOnly cookie,您不能,但是嘿,它起作用了!直到没有。

然后,最近的解决方法是将用户重定向到全新的窗口/标签中的iframe域,在其中设置随机cookie,从那时起,该子域在iframe中被“信任”。同样,它需要单击以打开新的窗口/选项卡,甚至还可以直观地看到新选项卡的打开。很多安全性,诸如此类的标准。

现在,从Safari 13开始-没有其他解决方法。没有更多安全的iframe cookie设置?

任何其他身份验证方案都对我们不利(例如Auth-X标头)。我们需要使用HttpOnly安全cookie,因为我们不希望JavaScript客户端以任何方式访问该令牌。

要清楚,所有其他浏览器都可以正常运行。

Relevant WebKit Bugzilla

有人有什么建议吗?

编辑:

感谢链接@tomschmidt,这似乎是正确的方向。 我尝试使用Apple的Storage Access API,但是很遗憾,尽管我确保在使用API​​初始化登录逻辑之前先请求访问权限:

requestStorageAccess = async() => {
    return new Promise(resolve => {
      //@ts-ignore
      document.requestStorageAccess().then(
        function () {
          console.log('Storage access was granted');
          resolve(true);
        },
        function () {
          console.log('Storage access was denied');
          resolve(false);
        }
      );    
    });
  }


const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();

仍然,在/ login API响应中收到的cookie不会在随后的对该API的调用中发送:(

3 个答案:

答案 0 :(得分:3)

我想我可能已经找到了解决方案:Apple的Storage Access API: https://webkit.org/blog/8124/introducing-storage-access-api/

答案 1 :(得分:2)

因此,只要新窗口存储了您要存储的cookie,解决方法仍然会起作用。 iframe仍然无法存储自己的Cookie。就我而言,我只需要会话ID cookie。因此,当用户授予存储访问权限时,我将打开一个小的弹出窗口。它获取并存储会话ID Cookie,然后关闭并重新加载iframe。然后,iframe可以访问会话ID Cookie,并在后续请求中发送它。我认为这只是暂时的,看起来他们将来打算从弹出窗口中删除存储访问权限。也许他们会修复当时无法存储Cookie的iframe。

答案 2 :(得分:-3)

只需转到首选项 command + , --> 隐私并取消选中防止跨站点跟踪