2011-03-06 77 views
43

我有一個使用Facebook Connect.js的Facebook應用程序。通過HTTPS的Facebook JavaScript SDK加載非安全項目

我正在通過HTTPS運行我的應用程序。網站上的所有內容都是從https://發送的,除了必須包含在Facebook的Connect.js

之內的一些內容除外。問題是我收到警告消息,指出網頁中存在不安全的項目。

我檢查使用Chrome的開發工具/網絡選項卡以查看哪些文件被加載,並從那裏被加載哪些腳本。

唯一一個我可以看到,正在通過HTTP載入,而不是通過HTTPS是一個名爲http://static.ak.facebook.com/connect/canvas_proxy.php文件。

如何強制此文件使用HTTPS?

+0

我會通知這個問題的Facebook。這肯定是一個他們需要解決的問題,可能是通過在switch語句中檢查協議。 – Jubair 2011-03-16 15:53:28

回答

54

TL; DR

調用FB.init之前設置FB._httpstrue。像這樣:

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

說明

如果unminify了Facebook的JavaScript SDK,你會發現它基本上是一個對象文本與一羣屬性。其中一個屬性是_https,這是一個布爾值。此屬性確定在提出API請求時要使用哪組URL(存儲在FB._domain中)。似乎Facebook爲每種類型的API請求保留了兩組URL - 一個安全的URL和非安全的URL - 然後使用名爲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是不是開源的,甚至有據可查的,所以我不能提出這種改變pull請求:P。在短期內,設置FB._httpstrue之前手動撥打FB.init應該做的伎倆。

+0

+1,這對我們有效。很好的發現。我們的辦公室[向這個SDK提交了一個pull請求](https://github.com/facebook/connect-js/pull/285),但它現在可能也可能不是。 – 2011-09-01 20:09:31

+2

由於[this(so link)](http://stackoverflow.com/questions/7517670/fb-https-true-doesnt-play-nice-with-fb-canvas-setautoresize/7846888#7846888)我會改變'FB._https = true;'到'FB._https =(window.location.protocol ==「https:」);'就像@ simon-bachler所說的 – 2011-10-21 08:35:11

+1

我仍然在看到「僅安全內容」警告IE9與我的iframe畫布應用程序。嘗試使用FB._https = true;和FB._https =(window.location.protocol ==「https:」); – Ian 2011-10-23 07:31:06

0

這似乎是由Facebook bug造成的。請參閱forum post

該錯誤在3/16被標記爲解析,但我仍然在觀察對canvas_proxy.php的非https請求。希望這將會很快被修復......

8

前幾天我遇到了這個問題。我的整個應用程序使用HTTPS,我的問題只是通過HTTP加載的個人資料圖片...我的快速和骯髒的修復是手動替換所有個人資料圖片的域名。例如,

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

你必須檢查,看看哪個網址您的個人資料圖片有。我假設他們不是來自完全相同的地方。查看您自己的個人資料圖片的網址,替代我在https://fbcdn-profile-a.akamaihd.net處獲得的內容。

Facebook documentation尋找更難後:

如果你需要的圖片要返回通過安全連接,可以將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); 

它的工作就像一個魅力,我停止了混合安全警告。我希望這有幫助!

9

那麼這將給你相同的協議鏈接:

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

2012年6月6日私有方法訪問將被棄用並刪除:http://developers.facebook.com/blog/post/2012/05/16/platform-updates--operation-developer-love/ 因此此修復程序將不再起作用。 顯然這個bug已經被Facebook修復了。 – sbaechler 2012-05-17 16:49:49

0

在旁註,如果你有你的HTML頁面像folllowing上的文檔類型聲明,提到「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"> 
2

添加到拉爾夫·霍爾茲曼和西蒙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',真)...},其中d =窗口! = window.parent & & ...截至2012年2月10日。

+0

在init()修復之後,這個額外的代碼有什麼問題? – thaddeusmt 2012-05-03 21:23:38

1

它看起來像FB._https作爲被替換:

FB._secure = (window.location.protocol == "https:"); 
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> 
相關問題