Facebook:不安全的JavaScript问题(document.domain值应该是相同的)

我是一个基于canvas的FB应用程序。 面对Chrome和Firefox的问题(尽pipe通常是Chrome):

1.当我在新的隐身Chrome浏览器窗口( https://apps.facebook.com/myfbappnamespace/ )上打开我的批准的fb应用安全url时,下面的错误只是第一次,而当我刷新页面错误已经走了(大部分时间)

在about:blank页面显示来自http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb=f2e4fe7b … os.com%2Ff4aeadb2&domain = www.mydomain.com&relation = parent&error =未知用户。

不安全的JavaScript尝试访问来自带有URL的框架的URL http://www.mydomain.com/control/myfacebookapp/ http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb= f2e4fe7b … os.com%2Ff4aeadb2&domain = www.mydomain.com&relation = parent&error = unknown_user。 请求访问的框架将“document.domain”设置为“facebook.com”,但是访问的框架没有。 两者都必须将“document.domain”设置为相同的值以允许访问。
xd_arbiter.php:18

不安全的JavaScript尝试访问来自带有URL的框架的URL http://www.mydomain.com/control/myfacebookapp/ http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb= f2e4fe7b … os.com%2Ff4aeadb2&domain = www.mydomain.com&relation = parent&error = unknown_user。 请求访问的框架将“document.domain”设置为“facebook.com”,但是被访问的框架没有。 两者都必须将“document.domain”设置为相同的值以允许访问。 xd_arbiter.php:18

2.当我尝试http url( http://apps.facebook.com/myfbappnamespace/ )时,控制台显示的错误是:

不安全的JavaScript尝试从URL http://apps.facebook.com/myfbappnamespace/从具有URL的帧访问帧https://s-static.ak.facebook.com/connect/xd_arbiter.php?version=18#channel= … F控制%2Ffacebookappchannelurl%3Ffb_xd_fragment%23xd_sig%3Df23e84e85c%26。 请求访问的帧具有“https”的协议,被访问的帧具有“http”的协议。 协议必须匹配。

现在,当我login到我的fb帐户,看看这些错误发生了什么,他们走了,有时只是有时。 我知道我在查询中使用“大部分时间”和“有时”,但这正是我所遇到的情况。 我也search了论坛,并认识到fb已经解决了这个本来应该是铬的具体问题。 我已经确定我的FB.init和其他调用是location.protocol值特定的。 还在canvasurl(http)和安全canvasurl(https)中configuration了正确的值。 也尝试使用这两个设置:帐户设置 – >安全 – >安全浏览 – >(启用以及禁用)

如果我在某处丢失某些东西,有人可以帮忙吗?

有很多可能的问题。 尝试以下解决scheme之一:

  • 协议必须相同(所以尝试访问iframe的页面必须具有提供iframe的站点的相同协议),所以如果要以沙盒模式(http而不是https)testing应用程序,请禁用“Secure浏览“testing帐户的模式
  • channel.in FB.init() (见下面的代码)
  • 启用Apache的头部模型,并将下面的行放在.htaccess中
  • 在body标签之后放置<div id="fb-root"></div> ,如fb doc中所述: https : //developers.facebook.com/docs/reference/javascript/
  • 尝试在用户操作之后放置所有自动login代码(如单击loginbutton)
  • 从Canvas URL(在应用程序→设置)中删除像http://yoursite.com?的尾部的斜杠http://yoursite.com?
  • 像这样编辑<html>标签: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="https://www.facebook.com/2008/fbml">

代码为.htaccess

 <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> 

代码渠道问题:

 FB.init({ appId: '1234567890', status: true, cookie: true, xfbml: true, channelUrl : '//yoursite.com/channel.html' }); 

您的服务器提供的channel.html应该包含这一行:

 <script src="//connect.facebook.net/en_US/all.js"></script> 

编辑

关于你的第一个问题:

 The page at about:blank displayed insecure content from http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb=f2e4fe7b…os.com%2Ff4aeadb2&domain=www.mydomain.com&relation=parent&error=unknown_user. 

这是一个预期的exception,用于testing一个条件 – 这没有副作用,所以不关心它。

请参考以下问题: 不安全的JavaScript尝试访问带有URL的框架:域,协议和端口必须匹配。

在我的例子中,我在“_Layout”视图中有一个“facebook-like-box”,我不得不在global.css文件中为它定制一些CSS。

 .fb_iframe_widget,.fb_iframe_widget span,.fb_iframe_widget span iframe [style] {
    宽度:100%!重要;
 }

然后,当我试图加载内部页面,如文章和新闻,其中有一个Facebook的分享button,它开始给我这个错误:

 Uncaught SecurityError:无法从“HTMLIFrameElement”中读取“contentDocument”属性:阻止源“http:// localhost:51826”访问源为“http://static.ak.facebook.com”的框架。 被访问的框架将“document.domain”设置为“facebook.com”,但是请求访问的框架没有。 两者都必须将“document.domain”设置为相同的值以允许访问。

不知何故,我认为这行CSS代码(通过在全球范围内)导致此问题,试图访问和修改我的共享button的iframe的行为。

  1. 删除那行CSS代码解决了这个问题。
  2. 将这行CSS代码移动到具有<style>标签内的“脸谱”框的特定页面中。