3

我正在編寫一個Facebook應用,列出用戶的朋友,與用戶提供的關於它們(存儲在Google App Engine數據庫中)的信息進行交叉引用。以下是我的應用程序的運作方式:驗證Facebook用戶服務器端

用戶登錄到Facebook之後,通過Facebook的Javascript SDK進行Graph API調用以獲取他們的朋友列表。同時,使用用戶的Facebook ID將AJAX請求發送到我的Google App Engine請求處理程序,並且處理程序從數據庫中發回有關用戶朋友的信息的JSON對象。這兩個列表然後在用戶的計算機上交叉引用。

這種方法的一個顯而易見的安全缺陷是,任何人都可以使用任意人的Facebook ID向我的處理程序發送請求,而無需以該人身份登錄Facebook,並獲取人員提供的關於他們的所有信息朋友。畢竟,Facebook ID是公開可用的。

爲了確保用戶的身份服務器端,我實現我自己的登錄系統的唯一方法是將用戶的訪問令牌包含在AJAX請求中,因爲訪問令牌證明用戶是登錄到Facebook。請求處理程序然後可以向Facebook Graph API發出一個虛擬請求,以驗證它是否有效。但是,這看起來很不方便,我不知道如何處理訪問令牌在傳輸到App Engine服務器時過期的可能性。我也看過Facebook Python SDK,但我不確定這可能會有什麼幫助。

App Engine服務器如何驗證Facebook用戶是否已登錄我的Facebook應用程序?

回答

4

嘗試使用signed_request而不是發送普通facebookID的 - 然後你可以解碼他們在服務器上,使用secret_id在Facebook APP頁面上給出。那麼沒有人能夠向你發送「假」查詢,因爲它們將無法在服務器端解密。

例如,我有允許用戶對給定條目進行投票的應用程序。用戶後接受我使用JavaScript來送他的票到服務器權限:

$.ajax({ 
      type: "POST", 
      url: base_url + 'vote/send', 
      data: { signed_request: response.authResponse.signedRequest, vote:vote }, 
}); 

在服務器端,我解碼signed_request讓用戶FacebookID並存儲爲合法的投票......以這種方式,沒有人能夠向我發送虛假投票,因爲signed_request採用的方式進行了加密,只有我的應用能夠對其進行解碼。

響應當然是對象,它是在用戶獲得使用應用程序許可後從SDK獲得的。