質問: $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
回答: Facebook\Helpers\FacebookRedirectLoginHelper はCSRF対策のため、セッションを利用するので、事前にセッションの利用を開始しておく必要があるらしいです。 laravelのSocialiteであればGithub用ですけどこんな感じでやってますので何か参考になれば幸いです ``` Route::get('/stars/', function (Request $request) { #トークンの取得をクッキーから試みる $github_token = $request->cookie('github_token'); $user_name = $request->cookie('user_name'); #トークンがクッキーに設定されていなければ if(!isset($github_token) || !isset($user_name)){ #Githubからのコールバックでトークンの取得を試みる try{ $user = Socialite::driver('github')->user(); } catch (Exception $e) { #GithubからのコールバックでなければユーザーをGithubへリダイレクトして #ユーザーにトークンの発行許可をしてもらう return Socialite::driver('github') ->redirect(); } #トークンを取得して、次回以降も再利用するためにクッキーに設定する $github_token = $user->token; $user_name = $user->getNickname(); Cookie::queue(Cookie::make('github_token', $github_token, 60*24*30)); Cookie::queue(Cookie::make('user_name', $user_name, 60*24*30)); } #取得したトークンを使用してユーザーのお気に入りのリポジトリリストをGithubから取得する $client = new Client();//use GuzzleHttp\Client; $query = [ 'per_page' => '100', ]; try{ $res = $client->get('https://api.github.com/users/'.$user_name.'/starred', [ 'query' => $query, 'headers' => [ 'Authorization' => ' token '.$github_token, ] ]); } catch (Exception $e) { #取得に失敗したのでトークンが無効になったものだと想定して、 #クッキーに保存されているトークンを削除して再発行する Cookie::queue(Cookie::forget('github_token')); Cookie::queue(Cookie::forget('user_name')); return Socialite::driver('github') ->redirect(); } ... ```