【问题标题】:Implementing Facebook PHP SDK (3.1.1) without $_SESSIONs在没有 $_SESSIONs 的情况下实现 Facebook PHP SDK (3.1.1)
【发布时间】:2011-11-24 02:34:38
【问题描述】:

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

PHP SDK 现在带有一个抽象的 BaseFacebook,并且他们有一个示例 Facebook 类实现,它依赖于 PHP $_SESSIONs。我运行着一个相当大的多服务器网站,这使得使用$_SESSIONs 变得很棘手——不能使用默认的基于文件的会话,并且数据库支持的会话通常出于性能原因而没有好处。不确定我是否希望它们在 Memcached 中,因为如果它被清除,用户不应该退出,等等。

具体的class只需要你为每个访问者持久化这4个字段:statecodeaccess_tokenuser_id。似乎并非所有这些都需要纯粹基于 $_SESSION。我正在尝试确定真正需要去哪里......

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

我很乐意将一些东西存储在数据库中,只要清楚地知道它只在必要时才被访问(不是在注销用户的每个页面请求上)。

基本上:在不使用 $_SESSIONs 的情况下验证 FB 用户是否可行?“会话”是指所有访问者(登录或未登录)的一些 PHP 设置的 cookie,将他们链接到服务器端数据。

【问题讨论】:

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


    【解决方案1】:

    statecode的说法是正确的,它们是在初始认证时一次性使用的,不需要持久化到其他页面。

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

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

    【讨论】:

      【解决方案2】:

      据我所知,code 不需要存储,因为它在身份验证期间只使用一次。
      您可能希望存储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 documentation,您不会花太多时间来完成它。
      所以最后,您可以将所有这些存储在会话中,但是,您最好将 user_id 存储在您的数据库中。我建议您使用会话来存储 access_token,并始终调用 getUser() 来了解访问者的状态。
      希望你得到了你想要的东西..
      编辑:你已经发布了两次相同的问题!!!

      【讨论】:

        【解决方案3】:

        我对 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();
        // }
        

        这是一个简单的解决方案,而且效果很好。

        【讨论】:

          【解决方案4】:

          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 使用的四个键存储在持久化数据中:'state'、'code'、'access_token' 和 'user_id'。

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

          “代码”用于从 Facebook 检索“access_token”。检索到“access_token”后不使用它。

          “access_token”用于对 Facebook oAuth API 的后续请求。我相信它只能维持大约 2 小时。

          “user_id”是用户的 Facebook ID。该值对于该用户是唯一的并且是持久的。可以无限保存。

          此信息在当前版本的 SDK 中仍然有效(在撰写本文时为 v3.2.2)。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-03
            • 2016-06-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多