[英]Implementing Facebook PHP SDK (3.1.1) without $_SESSIONs
我使用Facebook作為登錄我的網站的選項,然后代表他們做Graph API請求。 我正在升級到新的JavaScript SDK和PHP SDK,以便在10月1日截止日期之前使用他們最新的oAuth內容。
PHP SDK現在附帶一個抽象的BaseFacebook
,它們有一個依賴於PHP $_SESSION
的示例Facebook
類實現。 我運行一個非常大的多服務器網站,這使得使用$_SESSION
棘手 - 不能使用默認的基於文件的會話,並且數據庫支持的會話通常不利於性能原因。 我不確定我是否想在Memcached中使用它們,因為用戶不應該在它被清除后退出等等。
具體類只需要為每個訪問者保留這4個字段: state
, code
, access_token
, user_id
。 似乎並非所有這些都需要純粹基於$ _SESSION。 我正在努力確定真正需要去哪里......
state
數據似乎可以存儲在客戶端cookie中,因為它只用於CSRF預防的一次性使用。 code
真的需要持久化還是僅使用一次? user_id
和access_token
可以存儲在我的users
MySQL數據庫中嗎? 如果是這樣,我如何使用fbsr_
cookie識別Facebook-authed用戶登錄的用戶? 我很樂意將一些東西存儲在數據庫中,只要它清楚地表明它只在必要時被訪問(而不是每次登出用戶的頁面請求)。
基本上: 在不使用$ _SESSIONs的情況下驗證FB用戶是否可行? 在“會話”中,我指的是所有訪問者(登錄或未登錄)的PHP設置cookie,它們將它們與服務器端數據相關聯。
我在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();
// }
這是一個簡單的解決方案,它完美無缺。
您對state
和code
是正確的,它們是在初始身份驗證期間一次性使用,不需要持久保存到其他頁面。
Userid可以存儲在數據庫中,並且通常以永久條目的形式存儲。 Access_token可以存儲在數據庫中,但當然它不是永久值,必須經常刷新。 但它可以是一種避免使用會話或cookie的方法,只要您有其他方法來識別用戶,以便您可以從數據庫中提取令牌。
出於cookie(un)可靠性的原因,我從來沒有為使用PHP應用程序的Facebook應用程序的想法而瘋狂。 您可能需要查看http://www.braintilt.com/fbcookies.php ,了解有關避免依賴大多數Facebook示例所填充的會話的一些想法。 當然,如果您對cookie不感興趣,您可以設置自己的cookie,並使用它來傳播用戶標識符,而不是那里列出的GET / POST方法。
根據我所知, code
不需要存儲,因為它在auth期間只使用一次。
您可能希望存儲access_token
因為它可以幫助您調用圖api以獲取用戶信息(如果需要),但您必須記住它僅在2小時左右有效。 之后,您將不得不使用getLoginUrl()
重新授權。
顯然可以存儲user_id
,它是Facebook user_id,它不會改變。 但是要獲取user_id,您需要解析facebook發送的signed_request
。 或者你可以直接調用getUser()
。
當getUser()
返回null時,您知道用戶未經過Facebook身份驗證,然后您可以將用戶重定向到從getLoginUrl()
返回的url,以讓您的用戶通過facebook進行身份驗證。 驗證后,您將通過調用getUser()
獲取user_id。
因此,如果getUser()
返回user_id
則您知道用戶是Facebook的。
Facebook已經真正改進了PHP SDK文檔 ,它不會花費那么多時間來完成它。
最后,您可以將所有這些存儲在會話中,但是,最好將db_id存儲在數據庫中。 我建議你使用session來存儲access_token,並且總是調用getUser()來了解訪問者的狀態。
希望你得到你想要的東西..
編輯:你已經發布了兩次相同的問題!
Facebook的PHP SDK(與3.0版開始)被分成兩個主要部分,在Facebook
用來與Facebook的API和抽象類交互類BaseFacebook
。 Facebook
類擴展了這個抽象類。 BaseFacebook
抽象類為Facebook實現核心oAuth API,提供實例化新Facebook
對象時使用的所有公共面向函數。
會話處理相關函數是在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
使用四個密鑰存儲在持久數據中:'state','code','access_token'和'user_id'。
'state'用於確定oAuth請求的身份驗證中的當前狀態。 在檢索“代碼”后不使用它。
'code'用於從Facebook檢索'access_token'。 檢索到'access_token'后不使用它。
'access_token'用於對Facebook oAuth API的后續請求。 我相信大約2個小時才有用。
'user_id'是用戶的Facebook ID。 該值對於該用戶而言是唯一的並且是持久的。 它可以無限期保存。
此信息在當前版本的SDK中仍然有效(截至本文撰寫v3.2.2)。
有關Facebook PHP oAuth登錄流程的更多信息,請參閱Facebook開發人員頁面 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.