前提・実現したいこと
Laravel5.5でログインユーザーが使用するサイトを作っています。
フォームをPOST送信時にTokenMismatchExceptionが発生しました。
csrf_field() は記述していて、試しにCSRF認証を外してみたところ
POST後にsession_id( Session::getId() )が切り替わっていることがわかりました。
session_idが切り替わってしまうため、フォーム送信前にセットした値が取得できません。
9割のユーザーで正常に(TokenMismatchException、session_id変更も起こらず)サイト利用できています。
1割のユーザーでsession_id変更が起こります。
同様に1割のユーザーで画面遷移時にログイン状態が外れる現象も起こっていました。
今回その同じユーザーで、session_id変更のためGET通信しかできないような状態です。
ログイン状態が外れる現象については、
以下のように、loginUsingIdの第2引数rememberをtrueにすることで、解決していました。
PHP
1class SampleController extends Controller 2{ 3 public funcion login() { 4 // some code ... 5 //$auth->loginUsingId($userId); 6 $auth->loginUsingId($userId, $remember = true); 7 } 8}
csrf_field()記述部分です。
HTML
1<form action="/sample/confirm" method="POST"> 2 {{ csrf_field() }} 3 ... 4</form>
問題切り分けのためVerifyCsrfToken.php にて、CSRF認証対象から外しました。
PHP
1<?php 2 3namespace App\Http\Middleware; 4 5use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; 6 7class VerifyCsrfToken extends Middleware 8{ 9 /** 10 * CSRFバリデーションから除外するURI 11 * 12 * @var array 13 */ 14 protected $except = [ 15 'sample/confirm', 16 ]; 17}
試したこと
Controllerからさかのぼって調べていくと、
Authクラスの作成時点で、送信前と異なるsession_idになっていました。
PHP
1<?php 2 3namespace App\Http\Middleware; 4 5use Illuminate\Support\Facades\Auth; 6 7class SampleAuth 8{ 9 public function __construct() 10 { 11 $this->auth = Auth::guard(); 12 \Log::info( Session::getId() ); 13 } 14 public function handle($request, $next) 15 { 16 // some code ... 17 return $next($request); 18 } 19 20}
何か考えられることなどありますでしょうか?
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー