我使用Facebook作为登录我网站的选项,然后代表他们进行图谱API请求。我正在升级到新的JavaScript SDK和PHP SDK,以便在10月1日截止日期之前使用他们最新的oAuth内容。
PHP SDK现在附带了一个抽象BaseFacebook
,它们有一个依赖于PHP Facebook
的示例$_SESSION
类实现。我运行一个非常大的多服务器网站,这使得使用$_SESSION
很棘手 - 不能使用默认的基于文件的会话,并且数据库支持的会话通常不利于性能原因。我不确定我是否想在Memcached中使用它们,因为用户不应该在它被清除后退出等等。
具体class只需要为每位访问者保留这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服务器端数据。
答案 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)
您对state
和code
是正确的,它们是在初始身份验证期间一次性使用,不需要保留到其他页面。
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
类和抽象类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
使用的四个密钥存储在持久数据中:'州','代码'' 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。