在没有$\u会话的情况下实现Facebook PHP SDK(3.1.1)

在没有$\u会话的情况下实现Facebook PHP SDK(3.1.1),php,facebook,session,facebook-javascript-sdk,facebook-php-sdk,Php,Facebook,Session,Facebook Javascript Sdk,Facebook Php Sdk,我使用Facebook作为登录我的网站的一个选项,然后代表他们执行GraphAPI请求。我正在升级到新的JavaScript SDK和PHP SDK,以便在10月1日截止日期之前使用它们最新的oAuth PHPSDK现在附带了一个抽象的BaseFacebook,它们有一个依赖于PHP$\u会话的Facebook类实现示例。我运行了一个相当大的多服务器网站,这使得使用$\u SESSION非常棘手,因为无法使用默认的基于文件的会话,而数据库支持的会话通常由于性能原因而不好。我也不确定我是否想把它们

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

PHPSDK现在附带了一个抽象的
BaseFacebook
,它们有一个依赖于PHP
$\u会话的
Facebook
类实现示例。我运行了一个相当大的多服务器网站,这使得使用
$\u SESSION
非常棘手,因为无法使用默认的基于文件的会话,而数据库支持的会话通常由于性能原因而不好。我也不确定我是否想把它们放在Memcached中,因为如果清除了,用户就不应该注销,等等

具体只需要为每个访问者保留这4个字段:
状态
代码
访问令牌
用户id
。似乎并不是所有这些都需要纯粹基于$\u会话。我正试图确定什么是真正需要去的地方

  • 例如,
    状态
    数据似乎可以存储在客户端cookie中,因为它仅用于CSRF预防一次
  • auth
    code
    真的需要持久化吗,还是只使用一次
  • user\u id
    access\u令牌
    是否可以存储在my
    users
    MySQL数据库中?如果是这样的话,我如何使用
    fbsr\uu
    cookie识别Facebook授权用户登录他们
我很乐意在数据库中存储一些东西,只要它清楚地表明只有在必要的时候才可以访问它(而不是在每个请求注销用户的页面上)


基本上:不使用$\u SESSIONs对FB用户进行身份验证是否可行?这里的“SESSIONs”是指一些PHP为所有访问者(无论是否登录)设置cookie,将他们与服务器端数据链接起来。

关于
state
code
的说法是正确的,它们在初始身份验证期间一次性使用,不需要保存到其他页面

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


无论如何,出于cookie(un)可靠性的考虑,我从来没有对在Facebook应用程序中使用PHP会话的想法发狂过。您可能想了解一些关于避免对会话的依赖的想法,大多数Facebook示例都充满了这种依赖。当然,如果您不反对Cookie,您可以设置自己的Cookie,并使用它来传播用户标识符,而不是此处概述的GET/POST方法。

据我所知,
代码不需要存储,因为它在身份验证期间只使用一次。
如果需要,您可能希望存储
access\u令牌
,因为它将帮助您调用图形api以获取用户信息,但您必须记住,它仅在2小时左右的时间内有效。之后,您必须使用
getLoginUrl()
重新进行身份验证
用户id
显然可以存储,它是Facebook用户id,不会更改。然而,要获得用户id,您需要解析facebook发送的
签名请求
。或者您可以直接调用
getUser()

getUser()
返回null时,您知道该用户未通过facebook的身份验证,然后您可以将该用户重定向到从
getLoginUrl()
返回的url,以获得facebook对您的用户的身份验证。身份验证后,您将通过调用
getUser()

获取用户id 因此,如果
getUser()
返回一个
user\u id
,您就知道用户是Facebook授权的 Facebook真的改善了这一点,你不用花那么多时间就能完成它。
最后,您可以将所有这些存储在会话中,但是,最好将用户id存储在数据库中。我建议您使用会话存储访问令牌,并始终调用getUser()以了解访问者的状态。
希望你得到了你想要的东西。

编辑:你已经发布了两次相同的问题

我在PHPSDK的Facebook.php文件中做了一些更改。 只是将所有函数改为使用cookies,而不是$\u会话

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

并注释掉会话\u开始代码:

//if (!session_id()) {
// session_start();
// }
这是一个简单的解决方案,效果非常好

Facebook PHP SDK(从v3.0开始)分为两个主要部分,用于与Facebook API交互的
Facebook
类和抽象类
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
$\u SESSION
变量来存储此数据。通过在扩展
BaseFacebook
的您自己的类中实现这些函数,可以更改为您想要的任何类型的会话处理

BaseFacebook
使用的四个键存储在持久化数据中:“state”、“code”、“access\u token”和“user\u id”

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

“代码”用于