簡體   English   中英

在沒有$ _SESSIONs的情況下實現Facebook PHP SDK(3.1.1)

[英]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個字段: statecodeaccess_tokenuser_id 似乎並非所有這些都需要純粹基於$ _SESSION。 我正在努力確定真正需要去哪里......

  • 例如, state數據似乎可以存儲在客戶端cookie中,因為它只用於CSRF預防的一次性使用。
  • auth code真的需要持久化還是僅使用一次?
  • user_idaccess_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();
// }

這是一個簡單的解決方案,它完美無缺。

您對statecode是正確的,它們是在初始身份驗證期間一次性使用,不需要持久保存到其他頁面。

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.

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