在Cordova上保护postMessage()

在Cordova上保护postMessage(),cordova,iframe,postmessage,Cordova,Iframe,Postmessage,我的Cordova移动应用程序使用iframe加载到网站中。我想使用postMessage()通过iframe发送和接收内容。但是,通过我的测试,我的移动应用程序来源始终是localhost:8000或文件://。本网站上的所有其他示例都使用唯一的域和来源(例如www.example.com),但我的来源显然不是唯一的 如果我的来源是localhost:8000/文件://,我如何确保我的移动应用程序和我的网站之间的通信安全?如果出于任何原因我无法验证,我是否可以使用访问令牌验证任何通信,如下图

我的Cordova移动应用程序使用iframe加载到网站中。我想使用
postMessage()
通过iframe发送和接收内容。但是,通过我的测试,我的移动应用程序来源始终是
localhost:8000
文件://
。本网站上的所有其他示例都使用唯一的域和来源(例如www.example.com),但我的来源显然不是唯一的

如果我的来源是
localhost:8000
/
文件://
,我如何确保我的移动应用程序和我的网站之间的通信安全?如果出于任何原因我无法验证,我是否可以使用访问令牌验证任何通信,如下图所示

mobile.app

var iframe = document.getElementById('iframe');
var data = {
  'access_token': 'whatever'
};
iframe.contentWindow.postMessage(data, 'localhost:8000');
网站

window.addEventListener('message', function(event) {
  if (!event.data || !event.data.access_token) {return;}
  // ajax request to validate the token here
});
如果有帮助,我正在做的事情是:

  • 检测iframe何时完成加载。iframe发回一个对象<代码>{'loaded':true}
  • 当用户注销时,从iframe发送带有布尔值的对象<代码>{'logout':true}
  • 当用户按下打印按钮时,从iframe发送带有布尔值和html字符串的对象<代码>{'print':true,'html':htmlString}
  • 将加密负载发送到iframe,然后等待iframe返回对象<代码>{'success':true}

使用postMessage发送数据时,您可以通过指定https://... 在源url中

使用这种过程是一个跨站点脚本编写的门户,您应该在web应用程序和移动端验证呼叫者和被呼叫者。此处提供了有关postMessage的更多规范(以及关于威胁的有用注意事项):

对于身份验证,您必须将身份验证放在传输的数据中,就像您所做的那样(使用手机用户手工提供的东西,否则它不会验证任何东西)


要从cordova读取数据,您应该使用针对web服务器上服务的AJAX请求。

想知道为什么不使用InApp浏览器在应用程序中加载网站。因为我的移动应用程序使用自己的导航标题。我想定制的InApp浏览器应该可以帮到您。我查看了它。除了编辑插件本身(超出我的专业知识和范围),没有其他选择。然后你必须处理好这个链接中提到的东西-这并不能回答问题。如果原始url与移动应用程序的原始url不匹配,则无法设置原始url。移动应用程序的原始url始终为
localhost:8000
file://
,这意味着我无法放置任何以
https://
开头的url,因为它无法工作。我在您的数据流中遗漏了某些内容。。。iframe是来自web服务器的html流的结果,因此应该对其进行命名,除非cordova将其隐藏在这个通用的“localhost:8080”下。在这种情况下,当触发iframe onload事件时,尝试直接从主javascript以web服务器服务为目标。