【问题标题】:Communication between popup and opener from distinct domains来自不同域的弹出窗口和开启程序之间的通信
【发布时间】:2014-03-03 02:35:11
【问题描述】:

我正在使用 Phonegap(本地文件系统上的 js、css 和 html)编写一个应用程序,我想从中获取一个 oauth 令牌。 所以我打开一个弹出窗口来显示我们的身份验证服务器页面。在登录过程之后,它被重定向到我提到的在其 URL 中提供代码的页面。

看来重定向页面不能是本地文件(“不允许加载本地资源:file://...”)。 如果我重定向到使用 http 访问的页面,我会遇到“同源策略”问题(SecurityError: Blocked a frame with origin "http://..." from access a cross-origin frame),我不能使用 window.opener 从弹出窗口访问主页(在本地文件系统上)。

如何将弹出窗口中的代码传送到本地文件(存储、webSocket 等)?

【问题讨论】:

  • 我也遇到过同样的问题,但在不同的环境中。我的解决方法是尝试使用window.opener.postMessage 与主浏览器窗口通信,说明身份验证已完成。这在普通浏览器中工作得很好,但是 Cordova 的 inAppBrowser 没有暴露 window.opener 对象所以没有骰子。
  • 这个变通办法似乎解决了这个问题:blogs.telerik.com/appbuilder/posts/13-12-23/…
  • 最终,我发现使用自定义 loadstart 事件是一个更简单的解决方案:stackoverflow.com/a/18633515/2155068

标签: javascript cordova oauth-2.0 local same-origin-policy


【解决方案1】:

您不能使用 InAppBrowser 导航到此身份验证页面吗? (在此处查看更多信息:http://cordova.apache.org/docs/en/3.3.0/cordova_inappbrowser_inappbrowser.md.html)。

我不确定您的页面如何返回数据,但我确信有一种方法可以将生成的数据从 InAppBrowser 返回到您的应用程序。

【讨论】:

  • 当我尝试导航到身份验证页面时,该问题(“不允许加载本地资源”)不会发生。之后(link 中的第 4 步),当此身份验证页面上的登录过程成功并尝试重定向(http 重定向)到本地文件时,就会发生这种情况。浏览器内置安全设计似乎禁止重定向到本地文件。实际上,代码是通过其 url 提供给页面的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-10-21
  • 2014-10-07
  • 2012-06-15
  • 2013-12-30
相关资源
最近更新 更多