通过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._https
为true
。
所以这会给你相同的协议链接:
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>
- 如何在search = xxxsearchFacebook Graph API时获得Like Count数量
- Android – 分享到Facebook,Twitter,邮件,ecc
- Facebookcallback追加'#_ = _'返回URL
- 一张大图像比多张小图片效率更高。 Facebook风格
- 使用Facebook ios SDK在应用程序中注销Facebook
- 从用户访问令牌获取应用程序ID(或者validation源应用程序是否有令牌)
- iOS 6的Facebook发布过程结束与“remote_app_id不匹配存储的ID”错误
- 如何在Facebook上实现共享时显示特定的图像作为缩略图?
- AppDelegate,rootViewController和presentViewController