###前提・実現したいこと
Facebook for PHPでFacebookログインを実装したいと考えています。
フレームワークはLaravelを使っており、開発環境はcloud9です。
(ちなみにlaravelのパッケージSocaliteは試しましたが別のエラーがどうしても修正出来ず諦めてこちらのSDKを使っております)
機能の流れとしては、FacebookSDKforPHPのスタートガイドにあるように、
・Facebookログイン用のURLを取得する
・URLにアクセスするとfacebook側の認証ダイヤログが出て、ID/PASSを入力して承認すると、設定したコールバックURLにリダイレクトする
・リダイレクトされたらアクセストークンを取得しセッションに保存する
という感じで実装しています。
###発生している問題・エラーメッセージ
Facebookログインのリンクをクリックすると、facebook側の認証画面が出て、ID/PASSを入れ承認すると以下のようなエラーが発生します。
FacebookSDKException in FacebookRedirectLoginHelper.php line 246: Cross-site request forgery validation failed. Required param "state" missing from persistent data.
CSRFの検証の部分でパラメータの"state"が無いよと言われているようです。
コードをたどっていくと、
FacebookRedirectLoginHelperクラスのvalidateCsrfメソッド内にある、
$savedState = $this->persistentDataHandler->get('state');
の中身がnullになっており、
多分セッション?にあるはずのstateというパラメータが無いために、CSRFの検証が出来ずエラーになっているようです。
ただ、同じFacebookRedirectLoginHelperのmakeUrlメソッド内でログインURLを作成する際に、以下のコードでstateをセッション?に保存しています。
(pesistentDataが永続データというのは分かるのですがこれがどこに保存されているのかよく分かっていません)
$state = $this->persistentDataHandler->get('state') ?: $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); $this->persistentDataHandler->set('state', $state);
この時点で$stateにランダムな文字列が格納されているのは確認済みです。
なので、ログインURLを作成した際に保存した"state"がログインURLをクリックして認証を終えて戻ってきたら消えていた、みたいなことかな、と考えていますが、原因が全くわかりません。
ちなみに、承認後facebookから返ってくるURLはこんな感じです。
https://emerge0-yorinton.c9users.io/auth/login/callback/facebook?code=xxxxxxxxxxxxxxx&state=xxxxxxxxxxxx#_=_
(codeとstateの値は読みやすさのために短くしています)
なので、コールバックURLにはちゃんとパラメータstateがついているので、後はそのpersistentDataにstateがあって、2つのstateが一致するばCSRF検証通過、ということかな、と考えています。
こちらについて原因・解決策が分かりましたら教えていただけますと幸いです。
###補足情報(言語/FW/ツール等のバージョンなど)
・言語:PHP
・フレームワーク:Laravel
・開発環境:cloud9
・FacebookSDKのバージョン:v2.8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/28 04:29