通过HTTPS的Facebook JavaScript SDK加载不安全的项目

我有一个使用Facebook Connect.js的Facebook应用程序。

我通过HTTPS运行我的应用程序。 除了一些必须包含在Facebook的Connect.js内容之外,网站上的所有内容都是从https://提供的

问题是我收到警告消息,说明页面中存在不安全的项目。

我已经检查了使用Chrome的开发工具/networking标签来加载哪些脚本,以查看哪些文件正在加载以及从哪里加载。

我能看到的只能通过HTTP加载,而不通过HTTPS的是一个名为http://static.ak.facebook.com/connect/canvas_proxy.php的文件。

我怎样才能强制这个文件使用HTTPS?

TL; DR

在调用FB.init之前将FB.init设置为true 。 像这样:

 FB._https = true; FB.init({ /* your app id and stuff */ }); 

说明

如果你把Facebook的JavaScript SDK取消了,你会发现它基本上是一个包含一堆属性的对象字面值。 其中一个属性是_https ,这是一个布尔值。 该属性确定在进行API请求时要使用哪些URL(存储在FB._domain )。 似乎Facebook为每种types的API请求保留了两组URL(一个安全的URL和非安全的URL),然后使用名为getDomain()的开关函数来确定在请求时使用哪个URL。

JavaScript SDK导致安全警告的原因是由于定义了FB._https属性。 这是目前如何定义的2011-8-24:

_https: (window.name.indexOf('_fb_https') > -1)

显然Facebook认为,如果window.name属性中有_fb_https ,那么它必须是一个安全的应用程序。 这显然是不正确的。 真正的testing应该是这样的:

_https: window.location.protocol == "https:"

不幸的是,SDK不是开源的,甚至没有很好的文档,所以我不能提交一个拉请求这个变化:P。 在短期内, 在调用FB.init之前手动设置FB._httpstrue

所以这会给你相同的协议链接:

 FB._https = (window.location.protocol == "https:"); 

前几天我遇到了这个问题。 我的整个应用程序是使用HTTPS和我的问题是只能通过HTTP加载configuration文件图片…我快速和肮脏的修复是手动replace所有的个人资料图片的域名。 例如,

 str_replace('http://profile.ak.fbcdn.net','https://fbcdn-profile-a.akamaihd.net',$user['pic_square']); 

您必须检查并查看您的个人资料照片的url。 我假设他们不是来自完全相同的地方。 查看您自己的个人资料图片的url,并replace我在https://fbcdn-profile-a.akamaihd.net

在对Facebook文档进行更深入的研究之后:

如果您需要通过安全连接返回图片,则可以将return_ssl_resources参数设置为1: https ://graph.facebook.com/4/picture?return_ssl_resources = 1。

我发现了一个名为return_ssl_resources的附加参数,当它传递为true ,它将使用HTTPS返回configuration文件图片。

 $fql = "SELECT uid, name, pic_square FROM user WHERE uid=me()"; $param = array( 'method' => 'fql.query', 'query' => $fql, 'return_ssl_resources'=>1); $fbuser = $facebook->api($param); 

它像一个魅力,我不再受到混合安全警告。 我希望这有帮助!

除了Ralph Holzmann和SimonBächler之外,以下是FB._ https单独做不到的诀窍。

 FB._https = (window.location.protocol == "https:"); FB.init({ ... }); if (FB._https && window == window.parent) { if (FB._domain && FB._domain.staticfb && FB._domain.https_staticfb) FB._domain.staticfb = FB._domain.https_staticfb; } 

另请参阅FB.Arbiter.inform(){… FB.getDomain((d?'https _':'')+'staticfb',true)…}其中d = window!= window.parent && …截至2012年2月10日。

它看起来像FB._https被replace为:

 FB._secure = (window.location.protocol == "https:"); 

这似乎是由这个Facebook的bug 。

也看到这个论坛post 。

这个bug在3/16被标记为已解决,但是我仍然在观察对canvas_proxy.php的非https请求。 希望这将被固定为真正的…

在旁注中,如果您在HTML页面上具有文档types声明(如以下内容),则对“ http://www.w3.org ”的引用也会在Internet Explorer中引发内容警告错误。

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

我有一个类似的问题(fb注释不能在安全模式下工作)。 这解决了它 – 只需通过https引用javascript文件:

 <script type="text/javascript" src="https://connect.facebook.net/en_US/all.js"></script> 

或者不要指定这两个scheme同时工作:

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