PHP-SDK getUser()始终为0 /未经过身份验证

时间:2012-10-27 23:15:50

标签: facebook facebook-php-sdk codeigniter-2 csrf

我正在使用A3M CodeIgniter库,更新了FB PHP-SDK 3.2。

我被迫从2.x更新,因为Facebook前几天退出了他们的“传统”连接方法,这就是a3m框架所使用的。所以我更新了SDK,现在无法让连接过程工作的原因有很多:

  1. getLoginUrl()
  2. 的无限重定向
  3. CSRF state token does not match one provided错误(如果我找到用户,则不使用getLoginUrl()。)
  4. 用户总是0,即使我已登录FB。
  5. 我真的不确定此时该做什么。

    我的想法:

    • CodeIgniter可能正在删除回复code / state?不确定
    • 身份验证失败/除CSRF错误之外没有丢失错误(不是来自CI!)
    • 使用FB
    • 的无限重定向报告了许多问题(特别是在SO上)
    • 使用PHP SDK报告了很多关于CSRF问题的问题。

    REF:
    https://github.com/facebook/facebook-php-sdk - FB SDK
    https://github.com/pengkong/A3M-for-CodeIgniter-2.0 - A3M框架​​(我是其中的一员)。

    想法?

2 个答案:

答案 0 :(得分:2)

使用$facebook->destroySession()销毁会话以获取用户0.

关于2个Facebook SDK代码在同一个处理程序中两次检查令牌时有一个错误。

我编辑了facebook.php的getCode函数,如下所示:

protected function getCode() {
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) {
      return false;
    }
    if ($this->state === $_REQUEST['state']) {
        // CSRF state has done its job, so clear it
        $this->state = null;
        $this->clearPersistentData('state');
        return $_REQUEST['code'];
    }
    self::errorLog('CSRF state token does not match one provided.');

    return false;
}

更清楚,如果被调用两次则不会声明无效令牌。

要清楚,如果例如:

,可以在同一个url处理程序上调用该函数两次

$facebook->getUser();然后在同一个处理程序$facebook->getLogoutUrl()中,getCode()被调用两次,从而导致错误消息无效

答案 1 :(得分:0)

尝试将modules / account / helper中的fb_ca_chain_bundle.crt替换为https://github.com/facebook/facebook-php-sdk/tree/master/src

中的fb_ca_chain_bundle.crt