【发布时间】:2015-08-09 11:35:39
【问题描述】:
我有一个使用 localStorage 的网络应用程序。现在我们想通过 iframe 将这个 Web 应用程序嵌入到其他(第三方)网站上。我们希望提供类似于 youtube 的 iframe 嵌入,以便其他网站可以将我们的网络应用程序嵌入 iframe。从功能上讲,它就像不嵌入一样。但它不起作用。 Chrome 打印错误消息:
Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
我只是做了以下检查(在 iframe 中):
if (typeof window.localStorage !== 'undefined') {
// SETUP SESSION, AUHT, LOCALE, SETTINGS ETC
} else {
// PROVIDE FEEDBACK TO THE USER
}
我检查了 Chrome 中的安全设置,如 another Stackoverflow Thread 中所述,但它不起作用。是否有任何更改可以在不需要调整大多数现代浏览器的(默认)安全设置的情况下进行嵌入?
为了提供更多信息,我们将 Ember-CLI 用于我们的 Web 应用程序并打开了 CSP (more info about the Ember-CLI CSP)。 CSP 会导致我们的网络应用抛出安全错误吗?
【问题讨论】:
-
你的标题提到了
iframe? iframe 中有什么东西试图访问本地存储吗?听起来可能会触发安全警告? -
@Grapho:我重新表述了我最初的问题。我们只想为其他网站提供通过
iframe嵌入我们的网络应用程序的可能性。所以window.localStorage调用在我们的网络应用程序代码中,因此在iframe中。我们不想做任何花哨的跨域事情。只需通过 iframe 使我们的网络应用程序可用。希望这可以澄清问题。 -
如果网络应用使用本地存储,那么在 iframe 中运行它会导致跨域问题,因为 Window 是全局的...它将尝试访问本地客户端的 window.localstorage.. 记住 locastorage 是客户端浏览器的东西.. 不是托管/服务器的东西.. 你的应用程序不知道它是否从任何地方提供服务
-
不适用于 localStorage。如果您只想将内容存储在您的域中,则需要一个后端来将数据保存到...使用 ember-data 等。
-
我没有时间进一步调查这个问题。我只是再次尝试并没有将 iframe 嵌入到从文件系统提供的 html 文件中。相反,我使用了从网络服务器提供的文件。神奇的是,现在一切正常(在 Chrome、Firefox、IE11 和 Safari 中测试)。也许我没有以正确的方式解释我的问题,但当我第一次尝试时,它似乎可以正常工作。
标签: google-chrome iframe ember.js ember-cli content-security-policy