2009-10-16 98 views
1

根據Facebook API文檔,大部分工作都是通過javascript處理的。Facebook連接幫助

這意味着所有的處理都完成了,然後前端檢查用戶是否連接到Facebook /授權。對?

我的問題是:

假設一個用戶進入我的網站有史以來第一次。 他點擊「臉譜連接」。該javascript驗證他是真實的,並「重定向」到我的服務器上的另一個頁面。從那以後,我怎麼知道用戶實際上是通過我的網站進行身份驗證的,因爲一切都是在前端完成的?

我認爲這是正確的,但是是不是有一些安全問題..:

- 後用戶點擊登錄,Facebook的重定向到我的網站上的頁面。而且他們還會創建一個cookie,其中包含僅從該用戶檢索到的特定「Facebook ID」。我的退縮會「讀取」cookie並獲取該ID ...然後將其關聯到我的用戶ID。

如果這是正確的......那麼它沒有任何意義。如果人們竊取他人的「facebook ID」然後僞造cookie?然後我的後端看到cookie並認爲它是真正的用戶......?

我困惑嗎?如果我感到困惑,請幫助我重新組織並告訴我這是怎麼回事。

回答

6

Facebook Connect使用一個聰明的(或瘋狂的,取決於你的觀點)hack來實現你的網站和Facebook的身份驗證系統之間的瀏覽器內的跨站點通信。

它的工作方式如下:

  1. 您的網站包括一個非常簡單的靜態HTML文件,被稱爲跨域通信信道。該文件在FB文檔中稱爲xd_receiver.htm,但可以命名爲任何你喜歡的文件。
  2. 您的網站的登錄頁面包含對Facebook服務器上託管的Javascript庫的引用。
  3. 當用戶通過「連接」按鈕登錄時,它調用Facebook的JS API中的一個函數,彈出一個登錄對話框。此登錄框中有一個不可見的iframe,其中加載了跨域通信文件。
  4. 用戶填寫表單並提交表單,將表單發佈到Facebook。
  5. Facebook檢查登錄。如果成功,它會將此信息傳達給您的網站。以下是跨域內容的來源:
    1. 由於跨域安全策略,Facebook的登錄窗口無法檢查託管在服務器上的文檔的DOM樹。但登錄窗口可以更新其中的任何iframesrc元素,並且這用於與託管在頁面上的跨域通信文件進行通信。
    2. 當跨域通信文件接收到指示登錄成功的通信時,它將使用Javascript來設置一些包含用戶ID和會話的cookie。由於該文件存在於您的服務器上,因此這些cookie具有您的域名,您的後端可以接收它們。Facebook的服務器,而不是您在該第二級iframe生命 -
  6. 在Facebook的方向任何進一步的通信可以通過在其他iframe插入另一個嵌套iframe來實現。

餅乾很安全(理論上),因爲數據與,Facebook的生成時,你的開發者項目簽署了祕密密鑰簽名。 JS庫使用您的公鑰(「API密鑰」)來驗證Cookie。

理論上,Facebook的Javascript庫全部自動一旦你設置好一切處理此。在實踐中,我發現它並不總是順暢。

有關使用iframe的跨域通信機制的更詳細說明,請參閱MSDN上的this article

+0

謝謝friedo。 那麼,我的後端必須讀取cookie以檢查用戶是否已通過身份驗證?這是我從你的解釋中得到的印象。如果是這樣的話......那就不是那麼不安全了,因爲我可以竊取其他人的cookie + cookie中的數據......並自己「創建」cookie。然後登錄到網站? (然後我的退縮會讀取cookie並認爲我是合適的用戶。) – TIMEX 2009-10-16 22:11:51

+0

我對安全模型的複雜細節不太熟悉,但我想你可以捕獲並欺騙他們的cookie。這些cookie對於他們的帳戶和應用程序是獨一無二的,因此您只能使用他們授予您的任何權限,例如在其Feed中發佈評論。 – friedo 2009-10-17 02:29:47

0

請別人糾正我,如果我錯了 - 因爲我也試圖找出這些東西了自己。我對cookie的安全性的理解是,還有一個cookie,它是一個特殊的簽名cookie。這個cookie是通過組合其他cookie的數據創建的,添加只有你和FB知道的應用程序祕密,以及結果MD5-Hashed。然後,您可以測試這個哈希服務器端,這個哈希服務器不容易被複制,以確保可以信任來自FB的數據。

更迷人的解釋可以發現here - 一半左右滾動頁面向下。

0

這裏的問題相同,我認爲Scott更接近解決方案。

而且即時通訊使用「http://developers.facebook.com/docs/?u=facebook.jslib-alpha.FB.init」有開源的JS框架。所以事情有點不同。

對於我來說,通過開源JS框架,Facebook的提供,並設置我的網站上有簽名的會話。所以我的想法是在我身邊重新創建簽名。 - 如果兩者都匹配,那麼用戶就是他所說的他。

所以基本上如果用戶想要的東西保存到我的數據庫,抓住被Facebook建立會話的簽名並重新創建簽名與PHP和驗證它針對Facebook的一個給我?

if($_SESSION['facebookSignature'] == reGeneratedSignature){ 
    // save to database 
}else{ 
    // go away I don't trust you 
} 

但你如何重新生成簽名?最好不要打更多的電話給Facebook?