0

我正在尝试使用 php 构建一个 facebook 用户登录。我能够获取用户信息,但每次登录都会CSRF state token does not match one provided.在登录成功后在我的服务器上创建一个错误日志。

我在谷歌周围找到了很多创建 facebook 登录的教程。我还为同一问题找到了其他一些帖子。他们似乎不止一次地指责调用 getLoginUrl() ,而我没有这样做。而且由于我使用的是 sdk 附带的示例,我很困惑为什么它是开箱即用的。

<?php
    require 'facebook.php';

    $facebook = new Facebook(array(
        'appId'  => 'APP_ID',
        'secret' => 'APP_SECRET',
    ));

    $user = $facebook->getUser();

    if ($user) {
        try {
            $user_profile = $facebook->api('/me');

            $logoutUrl = $facebook->getLogoutUrl();
            echo "<a href=" . $logoutUrl . ">Logout</a><br><br>";
            print_r($user_profile);

        }
        catch (FacebookApiException $e) {
            error_log($e);
            $user = null;
        }
    }
    else {
        $loginUrl = $facebook->getLoginUrl();
        echo "<a href=" . $loginUrl . ">Login</a>";
    }
?>
4

1 回答 1

0

Facebook SDK 代码在同一处理程序中检查两次令牌时存在错误。

我编辑了这样的getCode函数facebook.php

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;
}

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

需要明确的是,如果例如:

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

于 2013-12-01T15:30:42.917 回答