質問: $helper->getLoginUrl('http://www.hoge.com/callback.php', $permissions); echo 'getLoginUrl経由ログイン'; echo 'getLoginUrlを経由せずログイン'; ?> --- 上記に書き換えたindex.phpをアップし下記のテストをしました。 ++++++++++++++++++++++++++++++++++++++ テスト2回目 【index.php】 ↓ getLoginUrlを経由せずログイン ↓ 【callback.php】 ↓ isset($accessToken) にならず、 はじめのページへ が表示される (1回目のようにエラーにならない!!!) ↓ 【index.php】 ↓ 今度は、 getLoginUrlを経由してログイン ↓ 【callback.php】 ↓ isset($accessToken) になったようで、めでたく ↓ 【mebmber.php】が表示される +++++++++++++++++++++++++++++++++++++++++ 上記のように、めでたく【mebmber.php】が表示されました。 getLoginUrlとgetAccessTokenの順番が原因だったようです。 --- やりたいこと --- 上記のように 【index.php】→【callback.php】→【index.php】→【callback.php】→【mebmber.php】と移動しないとログインできないのは本意ではありません。 【index.php】→【callback.php】→【mebmber.php】 としたいです。 【index.php】の中に 「【index.php】&【callback.php】&【index.php】」の内容を続けて記載したのですがFacebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing. エラーとなってしまいました。 【index.php】または【callback.php】をどのように記載すればいいでしょうか? よろしくお願いいたします。
回答: エラーの内容はCSRF対策として作ったトークン(state)がマッチしないためにおきているようですね 基本的な流れとしては、getLoginUrl()を実行したときに、トークンが作成され、getAccessToken()を実行したときにそのトークンの検証が行われるようです。 考えられる原因としては、 * トークンはSessionに保存されるので、session_start();がされているか コードを見る限りされているのでたぶんこれではなさそうですね * getLoginUrl()からgetAccessToken()の間に別のgetLoginUrl()を実行していないか 途中で別のgetLoginUrl()を実行するとsessionのトークンの値が書き換わってしまい。後にgetAccessToken()で検証するときにトークンが合わなくなるようです。 コードを見る限りそういった処理はなさそうですが、見えていない部分でそういった処理はないでしょうか あとは$_SESSION['FBRLH_state']というのが実際のトークンみたいなのでこの値を各所で出力してみて、値が変わる処理がないか調べるといいかと思います。