在没有$\u会话的情况下实现Facebook PHP SDK(3.1.1)
我使用Facebook作为登录我的网站的一个选项,然后代表他们执行GraphAPI请求。我正在升级到新的JavaScript SDK和PHP SDK,以便在10月1日截止日期之前使用它们最新的oAuth PHPSDK现在附带了一个抽象的在没有$\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非常棘手,因为无法使用默认的基于文件的会话,而数据库支持的会话通常由于性能原因而不好。我也不确定我是否想把它们
BaseFacebook
,它们有一个依赖于PHP$\u会话的Facebook
类实现示例。我运行了一个相当大的多服务器网站,这使得使用$\u SESSION
非常棘手,因为无法使用默认的基于文件的会话,而数据库支持的会话通常由于性能原因而不好。我也不确定我是否想把它们放在Memcached中,因为如果清除了,用户就不应该注销,等等
具体只需要为每个访问者保留这4个字段:状态
,代码
,访问令牌
,用户id
。似乎并不是所有这些都需要纯粹基于$\u会话。我正试图确定什么是真正需要去的地方
- 例如,
状态
数据似乎可以存储在客户端cookie中,因为它仅用于CSRF预防一次李>
- auth
code
真的需要持久化吗,还是只使用一次
user\u id
和access\u令牌
是否可以存储在myusers
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请求的身份验证中的当前状态。在检索到“代码”后不使用它
“代码”用于