0

PHPでFacebookユーザーログインを構築しようとしています。CSRF state token does not match one provided.ユーザー情報を取得できますが、ログインが成功すると、ログインするたびにサーバーにエラー ログが作成されます。

Facebookログインを作成するためのGoogleに関する多くのチュートリアルを見つけました。同じ問題に関する他の投稿もいくつか見つけました。彼らは 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 code has a bug when checking against tokens twice in the same handler.

I edited the getCode function of facebook.php like this:

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

to be more clear and does not state invalid token if called twice.

To be clear the function can be called twice on the same url handler if eg:

$facebook->getUser(); and then in the same handler $facebook->getLogoutUrl() then the getCode() is called twice thus resulting into and invalid error message

于 2013-12-01T15:30:42.917 に答える