簡體   English   中英

如何通過Facebook的Javascript SDK安全地授權用戶

[英]How to securely authorize a user via Facebook's Javascript SDK

我想讓用戶使用他們的Facebook ID登錄我的網站,而無需重新加載頁面。 這就是我使用Facebook Javascript SDK的原因 此方案使用此SDK描述授權流程: 在此輸入圖像描述

在流程結束時,我知道用戶已登錄,我知道他們的Facebook ID。 然后我可以通過此ID在我的數據庫中注冊它們,然后讓它們用它來登錄。

然而,這似乎非常不安全。 為了讓我的服務器端腳本知道用戶的ID,我必須通過AJAX發送它。 但是,我無法知道它是否是ID的所有者誰正在嘗試登錄。任何人都可以發送帶有ID的POST請求(特別是一個人獲取另一個用戶的ID)。

我目前的想法是讓用戶像往常一樣通過JS SDK登錄,通過AJAX將ID和訪問令牌發送到服務器,然后在PHP腳本中使用cURL以確保用戶實際登錄。

這是要走的路,還是我忽略了更好的選擇?

  1. 您不需要通過ajax推送用戶的ID。 您應該在服務器端使用保存signed_request的fbsr_ {app_id} cookie。 使用FB發出的'secret'app_secret解析此signed_request以獲取'user_id'。 注意:成功的解析還表明FB提供的cookie數據未被篡改。

  2. 解析signed_request后,您還應該獲得'issued_at'時間。 檢查此時間是否在最后10分鍾內。 通過執行此操作,您知道登錄請求會在用戶(使用user_id)使用客戶端SDK時命中您的服務器。 (參見: http//developers.facebook.com/roadmap/completed-changes/

  3. 您應立即將此代碼替換為access_token。 如果失敗(FB會給你一個OAuthException類型的錯誤消息),這意味着用戶登錄到facebook和獲得登錄請求之間存在不自然的延遲。

使用步驟#2,您可以使用舊的fbsr_ cookie阻止攻擊嘗試。 如果用戶(來自user_id)已經擁有您的帳戶,那么您可能希望在此處停止並登錄該用戶。 但是,可能存在app_secret可能遭到入侵的情況。 為了處理這種情況,您應該遵循步驟#3,因為access_token的代碼交換只能發生一次,並且在10分鍾內 發生 如果用戶沒有您網站的帳戶,那么您無論如何都需要步驟#3使用access_token從FB中檢索其他必要的用戶數據,如姓名,電子郵件等。

因此,只有在這10分鍾的安全漏洞內,才有可能竊取受害者的cookie並嘗試攻擊。 如果您對此安全漏洞不滿意,則應遷移到服務器端身份驗證。 決定取決於您存儲的用戶信息的敏感性。 並且您不會妥協任何移動到服務器端身份驗證的內容,您可以同時繼續使用客戶端方法來執行其他操作。

一旦您通過JS SDK登錄用戶,將設置一個包含憑據信息的特殊cookie(如果我是正確的話,用您的密鑰編碼)。 然后可以通過PHP SDK getUser()方法使用此信息。

只要您的API(您的ajax端點)與您的應用程序位於同一個域中,您就應該在用戶請求您的服務器時收到此cookie。

當然,您需要確保正確設置了Javascript SDK並且您使用了cookie: true config選項 ,並且您提供了有效的channel文件 如果不滿足這些要求,您可能在IE和Safari中遇到跨域通信和第三方cookie的問題。

您還可以查看此相關問題: FB身份驗證的正確方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM