web-dev-qa-db-ja.com

URLとセッションの「状態」パラメーターが一致しません

フェイスブックの文書で

require('include/facebook/autoload.php'); //SDK directory
$fb = new Facebook\Facebook([
'app_id' => '***********',
'app_secret' => '***********************'
]);

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'public_profile']; // optional
$loginUrl = $helper->getLoginUrl('http://www.meusite.com.br/login-callback.php', $permissions);

Url $ loginUrlに送信すると、次の結果が返されます。FacebookSDKがエラーを返しました:クロスサイトリクエストフォージェリの検証に失敗しました。 URLとセッションの「状態」パラメーターが一致しません

16
Pedro Henrique

同じエラーが発生しました。

getLoginUrl(...)の前にgetAccessToken()を実行したため、問題が発生しました

そのため、リダイレクトされたURLとコード内のgetLoginUrl(...)を取り除く必要があります。

28
tasmaniski

私は同じ問題を抱えていましたが、呼び出し前にlogin.phpページコードにsession_start();を入れなかったため、エラーが発生していましたgetLoginUrl(..)およびlogin-callback.phpページの上部にもあります。

login」ページと「login-callback」ページにsession_start();を入れるだけで機能しますまさにそれが今私のために働いているように。

17
gauravparmar

このエラーには2つの理由が考えられます。

  1. getLoginUrlを呼び出す前にsession_start();を呼び出していない
  2. login-callback.phpgetLoginUrlを再度実行したため、状態値が再生成され、リダイレクトされた値と一致しませんでした
6
Shaon

考えられる修正:次の構成設定を使用しました。

[詳細設定]タブでWebAuthLoginを有効にします。 $ loginUrlで指定したものと同じWebAuthLogin settinsでURLを提供します。

たとえば、$ loginUrlを https://example.com/ として使用する場合、WebAuthlogin Urlで同じものを使用します$ loginUrl = $ helper-> getLoginUrl( ' https:// example。 com / '、$ permissions);

4
TheVigilant

この問題は、同じページで2つ以上のログインリンクを生成する場合にも発生します(たとえば、1つはログイン用、もう1つは登録用です-両方が同じURLを指していても、ラベルが異なるだけです)。

Facebook SDKは、新しく生成されたloginURLごとに$ _SESSION [FBRLH_state]を作成/更新します。したがって、生成されたURLが2つある場合($ helper-> getLoginUrl()を使用)、$ _ SESSION [FBRLH_state]は2回書き換えられ、最後に生成されたURLに対してのみ有効です。以前のログインURLは無効になります。 2つの有効なloginURLを生成できないことを意味します。 2 同じ URLが生成される場合、最初のURLを返し、2番目のURLの生成のためにFacebook SDKの呼び出しを避けます。

4
Mojo

同じ問題がありました。

このエラーの理由は--->

「$ helper-> getLoginUrl」が呼び出されると、セッション変数「FB_State」が作成されます。これは、FBがトークンを照合するために使用するものです。 getLoginUrlが呼び出されるたびに、新しい状態が作成されます。その後、ユーザーが承認してリダイレクトした後、コードでこのイベントを検出できず、「$ helper-> getLoginUrl」を再実行すると、このエラーが発生します。

ソリューション->

  1. コーディングを改善し、承認されたら「$ helper-> getLoginUrl」の実行を再度停止します。

  2. すでに再実行している場合は、トークンのセッション変数をNULLに設定していれば、ユーザーは再び再認証できます。

  3. ユーザーが再承認を試みると、承認されたAPPを一度削除するか、「$ helper-> getReRequestUrl」で新しいリンクを生成する必要があります

ただし、「$ helper-> getLoginUrl」または「$ helper-> getReRequestUrl」が実行される前に、「getAccessToken()」によってトークンが呼び出されています。

幸運を!!!!!

3
Micah

最後に、FBコードを調べると、「クロスサイトリクエストフォージェリの検証に失敗しました。必要なパラメーター「状態」が見つかりません」などの問題は、PHP variable $ _SESSION ['FBRLH_state' ] FBがログインコールバックファイルを呼び出すときの何らかの「奇妙な」理由。

それを解決するために、関数$ helper-> getLoginUrl(...)の呼び出し後にこの変数「FBRLH_state」を保存します。変数$ _SESSION ['FBRLH_state']が設定されている場合、この関数の内部にあるため、この関数の呼び出し後にのみ行うことが非常に重要です。

Login.phpの私のコードの例の下:

$uri=$helper->getLoginUrl($uri, $permissions);
foreach ($_SESSION as $k=>$v) {                    
    if(strpos($k, "FBRLH_")!==FALSE) {
        if(!setcookie($k, $v)) {
            //what??
        } else {
            $_COOKIE[$k]=$v;
        }
    }
}
var_dump($_COOKIE);

そして、すべてのFBコードを呼び出す前にlogin-callback.phpで:

foreach ($_COOKIE as $k=>$v) {
    if(strpos($k, "FBRLH_")!==FALSE) {
        $_SESSION[$k]=$v;
    }
}

最後になりましたが、忘れずに、PHP session so ..

if(!session_id()) {
    session_start();
}
...
...
...
...
<?php session_write_close() ?>

この回答が8〜10時間の作業の節約に役立つことを願っています:)さようなら、アレックス。

2
ale500

同じエラーが発生しました。 1つのファイルまたは2つのファイルを使用していますか? 1つのファイルを使用して取得しようとしましたが、ドキュメントが推奨するようにlogin.phpとfb-callback.phpに分割すると、エラーが解決しました。セッションが書き直されていたため、状態が適切に保存されませんでした。

幸運を!

1
Erica

Facebookのsrcファイルの行を変更しなければならなかったため、この問題は少し混乱しました。

src/Facebook/Helpers/FacebookRedirectLoginHelper.php

関数で: "validateCsrf"このように:

if ($result !== 0) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
    }

それを次のように変更します。

if ($result === 0) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
    }

これがfacebook SDKのセキュリティに違反するかどうかはわかりませんので、この答えについての説明や推奨事項を本当に公開しました。

Facebookアプリマネージャーで次の変更を行うこともできます。

サイトとコールバックURLをFacebookアプリアカウントに追加します:

setting->advanced:Valid OAuth redirect URIs

各URLの最後にスラッシュ(/)を使用して別のURLを追加し、Client OAuth Settings。

1
Tarek

セッションで必要な変数が欠落しているときに発生します。いくつかの原因が考えられます。私の場合、コールバックURLから「www」を除外しました

0
Roy Toledo