App\Http\Kernel
, App\Providers\RouteServiceProvider
, routes/web.php
辺りはいじってませんか?
これらの場所に Middleware の設定があるのですが、Laravel では、CSRF トークンを保存するのに使われているセッションを有効にするのも、CSRF トークンのチェックを行うのも、Middleware で実現されているので、他が間違ってないとしたらこの辺りが怪しいと思いました。
https://github.com/laravel/framework/blob/7.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L134-L141
php
1 456
7 protected function tokensMatch($request)
8 {
9 $token = $this->getTokenFromRequest($request);
10
11 return is_string($request->session()->token()) &&
12 is_string($token) &&
13 hash_equals($request->session()->token(), $token);
14 }
CSRF トークンはここでチェックして、ダメだった場合は TokenMismatchException
を投げ、例外ハンドラ で try-catch して 419 を返しています。
vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
に dd()
を仕込んでみると、CSRF トークンがマッチしなかった直接の原因が解ると思います。
$request->session()->token()
が空っぽだったらセッションの問題、$this->getTokenFromRequest($request)
の返り値が空だったらリクエストの問題というように。
※vendor/
の中身は Git で管理していないと思うので、デバッグが終わった後、元に戻すのを忘れないようにしてください。
なお、@csrf
は csrf_field()
に 変換される ので、どちらで書いても結果は同じです。
(便利な書き方を用意しただけで、古い書き方を廃止する訳ではないようです)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 22:22
2020/06/01 07:48