facebook php登录CSRF

facebook php登录CSRF,php,facebook,csrf,Php,Facebook,Csrf,我正在尝试用php构建一个facebook用户登录。我能够获取用户信息,但每次登录都会在我的服务器上创建一个错误日志CSRF状态令牌与提供的不匹配。登录成功后 我在谷歌找到了很多创建facebook登录的教程。我也发现了一些其他的帖子,同样的问题。他们似乎责怪多次调用getLoginUrl(),而我并没有这样做。由于我使用的是sdk附带的示例,我不明白为什么它会被拆开 <?php require 'facebook.php'; $facebook = new Facebo

我正在尝试用php构建一个facebook用户登录。我能够获取用户信息,但每次登录都会在我的服务器上创建一个错误日志
CSRF状态令牌与提供的不匹配。
登录成功后

我在谷歌找到了很多创建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>";
    }
?>

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()
两次,从而产生无效的错误消息

您是否在facebook开发者网站的应用程序设置中允许您的URL?是的,我允许。任何我能找到的地方都可以放置一个我已经进入我的域名的URL。