3

我使用Facebook作爲登錄我的網站的選項,然後代表他們執行Graph API請求。我正在升級到新的JavaScript SDK和PHP SDK,以便在10月1日截止日期之前使用他們最新的oAuth內容。

PHP SDK現在帶有摘要BaseFacebook,他們有一個示例Facebook類實現依賴於PHP $_SESSION s。我運行了一個非常大的多服務器網站,這使得使用$_SESSION非常棘手 - 無法使用默認的基於文件的會話,而數據庫支持的會話往往不利於性能方面的原因。不知道我希望他們在Memcached中無論是作爲用戶不應該退出,如果它的清除等

具體class只需要你堅持每個訪問者這4個領域:statecodeaccess_tokenuser_id。似乎並非所有這些都需要純粹的基於$ _SESSION。我試圖確定什麼真正需要去的地方......

  • 例如,state數據好像它可以存儲在客戶端的cookie,因爲它是唯一的CSRF預防1次使用。
  • 驗證碼code確實需要保存還是僅使用一次?
  • 可以將user_idaccess_token存儲在我的users MySQL數據庫中嗎?如果是這樣,我如何使用fbsr_ cookie來識別Facebook認證用戶登錄他們的人?

我很高興來存儲一些東西在數據庫中只要很明顯,它纔可以訪問在必要時(未對已註銷的用戶每一個頁面請求)。

基本上:不使用$ _SESSIONs驗證FB用戶是否可行?在「會話」中,我的意思是一些PHP設置的cookie,用於所有訪問者(登錄或不登錄),將它們與服務器端數據鏈接起來。

回答

3

你即將statecode正確的,他們是最初的身份驗證過程中一次性使用的,不需要被持久化到其他頁面。

Userid可以存儲在數據庫中,並且通常作爲永久條目來完成。 Access_token可以存儲在數據庫中,但它當然不是一個永久值,必須經常刷新。但是,只要您有其他方式來識別用戶,您就可以避免使用會話或cookie,以便從數據庫中獲取令牌。

由於cookie(un)可靠性的原因,我從來沒有爲Facebook應用程序使用PHP會話的想法感到瘋狂。您可能想看看http://www.braintilt.com/fbcookies.php以瞭解有關避免依賴大多數Facebook示例所帶來的會話的一些想法。當然,如果你不反對cookie,你可以設置你自己的,並使用它來傳播用戶標識符,而不是那裏概述的GET/POST方法。

+0

鏈接已死亡。 – AndreKR

2

基於我所知道的,code不需要存儲,因爲它在驗證過程中僅使用一次。
您可能想要存儲access_token,因爲它可以幫助您根據用戶信息調用圖表API,但是您必須記住它僅在2個小時左右纔有效。之後,您將不得不使用getLoginUrl()重新授權。
user_id顯然可以存儲,這是Facebook的user_id,它不會改變。但是,要獲取user_id,則需要解析Facebook發送的signed_request。或者您可以直接致電getUser()
getUser()getUser()返回null時,您知道用戶未通過Facebook認證,然後您可以將用戶重定向到從getLoginUrl()返回的url,以便讓用戶通過Facebook進行身份驗證。認證後,您將通過調用getUser()來獲取user_id。
因此,如果getUser()返回user_id,您就知道用戶是Facebook認證的。
Facebook已經真正改進了PHP SDK documentation,它不會花很多時間來通過它。
因此,最後,你可以將所有這些存儲在會話中,但是,最好將user_id存儲在數據庫中。我建議,你使用session來存儲access_token,並且總是調用getUser()來了解訪問者的狀態。
希望你有什麼你在找..
編輯:你已經發布了兩次相同的問題!

+0

爲什麼反對,答案不完整? –

4

我在PHP SDK中對Facebook.php文件做了一些修改。 剛剛更改了所有功能,以使用Cookie而不是$ _SESSION。

// $_SESSION[$session_var_name] = $value; 
setcookie($session_var_name, $value, time() + 3600, '/'); 

和註釋掉在session_start代碼:

//if (!session_id()) { 
// session_start(); 
// } 

這是簡單的解決方案,它完美的作品。

+0

這適用於最新的PHP SDK? – Maurice

0

Facebook PHP SDK(從v3.0開始)分爲兩個主要部分,Facebook類用於與Facebook API和抽象類BaseFacebook進行交互。 Facebook類擴展了這個抽象類。抽象類實現了Facebook的核心oAuth API,提供了實例化新對象時使用的所有面向公衆的功能。

與會話處理相關的功能是在Facebook類中實現的抽象函數。有四項功能必須實現:

/** 
* Stores the given ($key, $value) pair, so that future calls to 
* getPersistentData($key) return $value. This call may be in another request. 
* 
* @param string $key 
* @param array $value 
* 
* @return void 
*/ 
abstract protected function setPersistentData($key, $value); 

/** 
* Get the data for $key, persisted by BaseFacebook::setPersistentData() 
* 
* @param string $key The key of the data to retrieve 
* @param boolean $default The default value to return if $key is not found 
* 
* @return mixed 
*/ 
abstract protected function getPersistentData($key, $default = false); 

/** 
* Clear the data with $key from the persistent storage 
* 
* @param string $key 
* @return void 
*/ 
abstract protected function clearPersistentData($key); 

/** 
* Clear all data from the persistent storage 
* 
* @return void 
*/ 
abstract protected function clearAllPersistentData(); 

這些類用於獲取,設置和清除會話使用的任何持久性數據。在默認的Facebook類中,這些使用PHP $_SESSION變量來存儲這些數據。通過在擴展BaseFacebook的自己的類中實現這些功能,可以更改爲您希望的任何類型的會話處理。

有由BaseFacebook使用四個鍵被存儲在持久數據:「州」,「代碼」,「ACCESS_TOKEN」和「USER_ID」。

「狀態」用於確定oAuth請求的身份驗證中的當前狀態。檢索「代碼」後不會使用它。

「代碼」用於從Facebook中檢索「access_token」。它在檢索'access_token'後不會被使用。

'access_token'用於後續對Facebook oAuth API的請求。我相信只有2個小時左右。

'user_id'是用戶的Facebook ID。該值對於該用戶是唯一的並且是持久的。它可以無限期地保存。

此信息在當前版本的SDK中仍然有效(截至撰寫本文時爲止,版本3.2.2)。

有關Facebook PHP oAuth登錄流程的更多信息,請參閱the Facebook developer page

相關問題