Chrome中的iframe错误:无法从"窗口"中读取"localStorage":此文档的访问被拒绝

tsc*_*chi 25 iframe google-chrome ember.js content-security-policy ember-cli

我有一个使用localStorage的网络应用程序.现在我们想通过iframe在其他(第三方)网站上嵌入此网络应用.我们希望提供类似于youtube的iframe嵌入,以便其他网站可以将我们的网络应用嵌入到iframe中.在功能上它就像它不会被嵌入一样.但它不起作用.Chrome会输出错误消息:

Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
Run Code Online (Sandbox Code Playgroud)

我只是做了以下检查(在iframe中):

if (typeof window.localStorage !== 'undefined') {
    // SETUP SESSION, AUHT, LOCALE, SETTINGS ETC
} else {
    // PROVIDE FEEDBACK TO THE USER
}
Run Code Online (Sandbox Code Playgroud)

我在Chrome中检查了我的安全设置,就像在另一个Stackoverflow线程中所描述的那样,但它不起作用.在不需要调整大多数现代浏览器的(默认)安全设置的情况下,是否可以进行嵌入更改?

为了提供更多信息,我们使用Ember-CLI作为我们的Web应用程序并打开了CSP(有关Ember-CLI CSP的更多信息).CSP会导致我们的网络应用程序出现安全错误吗?

Pau*_*ish 23

在Chrome的设置>隐私>内容设置下,您将Cookie设置设置为"阻止网站设置任何数据"

此复选框是导致异常的原因.

  • 如果它不是默认值,它几乎无法使用,因为用户不会更改设置以使用某些网站. (8认同)
  • 这不是关于“阻止网站设置任何数据”选项,而是:“阻止第三方 cookie 和网站数据”设置不会使大多数网站无法使用,但会切断大多数与您的搜索相关的广告 (4认同)
  • 期望访问者为此调整他们的设置似乎很不合理。而且我确信必须有更好的解决方案。我在尝试在网站上使用 Youtube API 时遇到了这个问题。Youtube 在其他网站上运行良好,无需更改任何设置。必须有更好的解决方案,否则 Youtube 将无法在其他网站上运行。 (4认同)
  • 我们正在 Iframe 中加载 React 应用程序,在 Mac + Chrome 中,出现此错误。我们无法告诉客户使用上述方法来修复错误。JavaScript 有什么办法吗? (3认同)
  • 当我发现某些功能出现问题时,我正在以隐身方式测试我的网站。看来 Chrome 的隐身模式现在默认会阻止 iframe 中使用“localStorage”(当您打开新的隐身页面时,有一个“阻止第三方 cookie”的切换开关)。 (3认同)

Pri*_*rid 21

如果您使用隐身模式,请确保将其关闭 "Block third-party cookies"

在任何隐身窗口中打开一个新选项卡,然后关闭该选项:

在此输入图像描述


ale*_*rio 14

根据这个

在"内容设置"中设置"阻止第三方Cookie和网站数据"复选框时,会引发此异常.
要查找设置,请打开Chrome设置,在搜索框中输入"第三个",单击"内容设置"按钮,然后查看"Cookie"下的第四个项目.

在此输入图像描述


Som*_*omu 7

localStorage是每个域,每个协议。如果您尝试localStorage从独立文件(即使用file:///协议)访问,则本身没有域。因此,浏览器目前会抱怨您的文档无法访问localStorage. 如果您将文件放在 Web 服务器中(例如部署在 Tomcat 中)并从 访问它localhost,您将能够访问localStorage.

  • 我自己今天在网站内遇到​​了 iFrame 的问题..因此您的答案缺少一些内容:/仍在阅读有关它的信息,如果我发现任何内容,我会让您知道。 (2认同)

e18*_*18r 7

在以下URL上:chrome://settings/content/cookies取消选中“阻止第三方cookie”。


Jak*_*ann 6

我在手机中遇到了这个问题,我无法用 chrome 打开某个网站。我花了一些时间在手机上找到cookie,当我找到它时,我看到我的cookie被阻止了。

转到您的设置 --> 站点设置 --> Cookie

并允许站点保存和读取 cookie 数据,确保您不阻止第三方 cookie! 手机 chrome 浏览器中的 cookie

我希望这可以帮助你。


小智 6

如果禁用阻止第三方 cookie 不是一个选项,您可以使用 try...catch:

try {
 // SETUP SESSION, AUHT, LOCALE, SETTINGS ETC
} catch(err) {
 // PROVIDE FEEDBACK TO THE USER
}
Run Code Online (Sandbox Code Playgroud)


Sep*_*eed 5

我检查了所有答案,但最终什么也没找到。然后我意识到我正在使用什么浏览器。如果您使用 Brave(基于 Chromium),如果您的护盾已打开,您将收到此错误。尝试降低你的盾牌。

在此输入图像描述


Mik*_*ost 3

正如评论中所指出的,本地存储只是单一来源——页面的来源。尝试从从不同来源加载的 iframe 访问页面的本地存储将导致错误。

您能做的最好的事情就是通过 postMessage API 使用 XDM 破解它。这个库声称可以为您完成繁重的工作,但我还没有尝试过。不过,在走这条路之前,我会确保您了解IE 对 XDM 的糟糕支持。