Safari 13+ iframe阻止CORS Cookie


9

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

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

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

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

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

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

明确地说,所有其他浏览器都可以正常运行。

相关的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的调用中发送:(


确保仅在与iframe进行显式交互(例如onclick)时触发此操作。
tomschmidt

1
是的,这就是我做到的方式。看看我链接到的webkit bugzilla问题,我想这是Safari端的实际错误:/
Tom Teman

问题不在于未发送cookie。如果您请求存储访问,现有的cookie将发送到服务器。问题在于根本不存储任何新的cookie,因此它们不在那里被发送。
Matt Cosentino

@MattCosentino是的,这就是我的意思-“在/ login API响应上收到的cookie”是新的cookie,它们会在Set-Cookie标头响应中发送回iframe域,但是下一个来自iframe域的调用不包括那些cookie请求中的Cookie。所以是的,更确切地说,问题的根源在于在这种情况下浏览器中没有存储任何新的cookie。
Tom Teman

Answers:



0

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


马特,我在弹出窗口上使用了类似的解决方案,该解决方案可在桌面Safari 13.1上运行,但在iPad Safari 13.4上进行测试无法正常工作。您是否可以在iPad上使用它?Thnx
teamdane
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.