43

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

我正在通过 HTTPS 运行我的应用程序。除了https://某些必须包含在 Facebook 的Connect.js

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

我已经使用Chrome的开发者工具/网络选项卡检查了正在加载哪些脚本,以查看正在加载哪些文件以及从何处加载。

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

如何强制此文件使用 HTTPS?

4

8 回答 8

54

TL;博士

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

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

解释

如果您取消 Facebook JavaScript SDK 的最小化,您会发现它基本上是一个带有一堆属性的对象字面量。其中一个属性是_https,它是一个布尔值。FB._domain此属性确定在发出 API 请求时要使用(存储在 中)哪一组 URL 。似乎 Facebook 为每种类型的 API 请求保留了两组 URL——一个安全 URL 和一个非安全 URL——然后使用调用的 switch 函数getDomain()来确定在发出请求时使用哪个。

JavaScript SDK 引起安全警告的原因是FB._https属性的定义方式。这是它目前在 2011-8-24 时的定义:

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

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

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

不幸的是,SDK 不是开源的,甚至没有很好的文档记录,所以我不能提交这个更改的拉取请求:P。在短期内,在调用之前设置FB._httpstrue手动FB.init应该可以解决问题。

于 2011-08-24T20:36:56.820 回答
9

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

FB._https = (window.location.protocol == "https:");
于 2011-10-03T16:44:40.653 回答
8

几天前我遇到了这个问题。我的整个应用程序都在使用 HTTPS,而我的问题只是通过 HTTP 加载个人资料图片......我快速而肮脏的解决方法是手动替换所有个人资料图片的域名。例如,

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

您必须检查并查看您的个人资料图片的 URL。我假设他们不是来自完全相同的地方。查看您自己的个人资料图片的 URL 并替换我在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 返回个人资料图片。

$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);

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

于 2011-08-24T18:27:33.157 回答
2

除了 Ralph Holzmann 和 Simon Bä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) ... } where d=window!=window.parent&&...截至 2012 年 2 月 10 日。

于 2012-02-10T02:29:39.213 回答
1

它看起来像 FB._https 被替换为:

FB._secure = (window.location.protocol == "https:");
于 2012-07-09T21:24:12.580 回答
0

这似乎是由这个Facebook 错误引起的。

另请参阅此论坛帖子

该错误在 3 月 16 日被标记为已解决,但我仍在观察对 canvas_proxy.php 的非 https 请求。希望这将很快得到修复......

于 2011-03-18T21:27:24.680 回答
0

在旁注中,如果您的HTML页面上有如下的文档类型声明,那么对“ 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">
于 2011-10-28T07:48:48.630 回答
0

我遇到了类似的问题(fb 评论无法在安全模式下工作)。这解决了它 - 只需通过 https 引用 javascript 文件:

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

或者不指定适用于两者的方案:

<script type="text/javascript" src="//connect.facebook.net/en_US/all.js"></script>
于 2013-09-20T03:52:44.250 回答