1

重複の可能性:
CSRF 状態トークンが提供されたものと一致しない FB PHP SDK 3.1.1 Oauth 2.0
CSRF 状態トークンが提供されたものと一致しない

Facebook API で同様の問題に直面している開発者を何度も確認しました。PHP-SDK は実行ごとに次のようなエラーをログに記録します。

CSRF state token does not match one provided.

奇妙なことに、目的のアプリケーションは正常に動作しているようです (これはバッチ ポスト スクリプトであり、バッチをリセットするとすぐにこのエラーが生成されます)。

そこで、ここで提供されている PHP-SDK の base_facebook.php まで追跡しました。このコードを変更しました(ここにあります):

protected function getCode() {
    if (isset($_REQUEST['code'])) {
      if ($this->state !== null &&
          isset($_REQUEST['state']) &&
          $this->state === $_REQUEST['state']) {

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

これに(エラーログでエラーを追跡するためだけに):

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

    return false;
  }

アプリを再度実行すると、更新されたエラーが次のように表示されます。

CSRF state token does not match one provided. state is null. states do not match.

現在、$this->state() は NULL です。これが Facebook SDK のエラーの中で最も少ないとは思っていませんでした。私のアプリは、ユーザーが私のアプリとのセッションを持っていない場合にのみ、ログイン URL リクエストを 1 つしか生成しないと確信しています。

助けていただければ幸いです。

4

0 に答える 0