在没有$ _SESSIONs的情况下实现Facebook PHP SDK(3.1.1)

时间:2011-09-24 03:27:03

标签: php facebook session facebook-javascript-sdk facebook-php-sdk

我使用Facebook作为登录我网站的选项,然后代表他们进行图谱API请求。我正在升级到新的JavaScript SDK和PHP SDK,以便在10月1日截止日期之前使用他们最新的oAuth内容。

PHP SDK现在附带了一个抽象BaseFacebook,它们有一个依赖于PHP Facebook的示例$_SESSION类实现。我运行一个非常大的多服务器网站,这使得使用$_SESSION很棘手 - 不能使用默认的基于文件的会话,并且数据库支持的会话通常不利于性能原因。我不确定我是否想在Memcached中使用它们,因为用户不应该在它被清除后退出等等。

具体class只需要为每位访问者保留这4个字段:statecodeaccess_tokenuser_id。似乎并非所有这些都需要纯粹基于$ _SESSION。我正在努力确定真正需要去哪里......

  • 例如,state数据似乎可以存储在客户端cookie中,因为它只用于CSRF预防的一次性使用。
  • auth code是否真的需要持久存在或仅使用一次?
  • user_idaccess_token可以存储在我的users MySQL数据库中吗?如果是这样,我如何使用fbsr_ cookie识别Facebook-authed用户登录的用户?

我很乐意将一些东西存储在数据库中,只要它清楚地表明它只在必要时被访问(而不是每次登出用户的页面请求)。

基本上:在不使用$ _SESSIONs的情况下对FB用户进行身份验证是否可行?在“会话”中,我指的是所有访问者(已登录或未登录)的PHP设置cookie服务器端数据。

4 个答案:

答案 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();
// }

这是一个简单的解决方案,它完美无缺。

答案 1 :(得分:3)

您对statecode是正确的,它们是在初始身份验证期间一次性使用,不需要保留到其他页面。

Userid可以存储在数据库中,并且通常以永久条目的形式存储。 Access_token可以存储在数据库中,但当然它不是永久值,必须经常刷新。但它可以是一种避免使用会话或cookie的方法,只要您有其他方法来识别用户,这样您就可以从数据库中提取令牌。

出于cookie(un)可靠性的原因,我从来没有为使用PHP应用程序的Facebook应用程序的想法而疯狂。您可能需要查看http://www.braintilt.com/fbcookies.php有关避免依赖大多数Facebook示例所填充的会话的一些想法。当然,如果您对cookie不感兴趣,您可以自行设置,只需使用它来传播用户标识符,而不是那里列出的GET / POST方法。

答案 2 :(得分:2)

根据我所知,code无需存储,因为它只能在auth期间使用一次。
您可能希望存储access_token,因为它可以帮助您调用图表api以获取用户信息(如果需要),但您必须记住它仅在2小时左右有效。之后,您必须使用getLoginUrl()重新验证 user_id显然可以存储,它是Facebook user_id,它不会改变。但是要获取user_id,您需要解析facebook发送的signed_request。或者您可以直接致电getUser()getUser()返回null时,您知道用户未经过Facebook身份验证,然后您可以将用户重定向到从getLoginUrl()返回的网址,以让您的用户通过Facebook进行身份验证。验证后,您将通过致电getUser()获取user_id 因此,如果getUser()返回user_id,则您知道用户已获得Facebook身份验证 Facebook确实改进了PHP SDK documentation,你不会花太多时间来完成它 最后,您可以将所有这些存储在会话中,但是,最好将db_id存储在数据库中。我建议你使用session来存储access_token,并且总是调用getUser()来了解访问者的状态。
希望你得到你想要的东西..
编辑:你已经发布了两次相同的问题!!!

答案 3 :(得分:0)

Facebook PHP SDK(从v3.0开始)分为两个主要部分,用于与Facebook API交互的Facebook类和抽象类BaseFacebookFacebook类扩展了这个抽象类。 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使用的四个密钥存储在持久数据中:'州','代码'' access_token',以及' USER_ID'

'州'用于确定oAuth请求的身份验证中的当前状态。它不会在“代码”之后使用。被检索。

'代码'用于检索' access_token'来自Facebook。在' access_token'之后不会使用它。被检索。

' access_token'用于随后的Facebook oAuth API请求。我相信它只有2个小时左右。

' user_id'是用户的Facebook ID。该值对于该用户而言是唯一的并且是持久的。它可以无限期保存。

此信息在当前版本的SDK中仍然有效(截至编写v3.2.2时)。

有关Facebook PHP oAuth登录流程的详细信息,请参阅the Facebook developer page