アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

Laravelの419エラーでハマった話

ある日、メンバーからヘルプ要請がきた。
内容は


「CSRFトークンの値がないため419エラーとなる」

です。

f:id:agonosetaro:20200123142017p:plain:h200

.oO(そこまでわかっているなら解決できそうですね

...では終わらなかった

環境

  • Laravel6.2
  • viewにbladeを使用
    • これまでVue.jsでAPIと画面分けてたので今回blade初使用

どうやら以下を試したが解決できないとのこと。

  • formタグの前に@csrf{{ csrf_field() }}を追加(ネットでの対策法)
    • 効果なし
  • formタグの前にinput type="hidden" name="_token" value="{{ csrf_token() }}"を追加
    • 効果なし
  • LaravelのCSRF保護を除外することができるため、対象の箇所で除外して実装を行なっている(除外した場合はエラーが出なくなる)
    • セキュリティの観点から除外するのは好ましくない

ふむ。確かにネットで調べると上記の@csrfを追記すれば解決とあるのですが、 実際に表示されるページを確認すると、

<input type="hidden" name="_token" value="" >

のようにvalueに値が入ってこない状態です。

そこからググって試したこと(全部ダメ)

「laravel csrf token value is empty」でぐぐると結構でてきましたが、どれもダメ。

  • Route::group(['middleware' => 'web'] ミドルウェアのwebを追加する。
    • しかし最近のLaravelはweb.phpにルート記述すれば勝手にこの設定になるとのこで、効果なし。
  • キャッシュ系のクリア
    • 効果なし
  • php artisan generate:key
    • 効果なし

解決へ

公式を何度も確認。

Laravelは、アプリケーションが管理するアクティブなユーザーセッションごとにCSRF「トークン」を自動的に生成します。このトークンは、認証されたユーザーが実際にアプリケーションにリクエストを行っていることを確認するために使用されます。

セッションを念のため確認すると....

空!!

圧倒的、空!!

何も入っていない!!

なぜ?!

原因はControllerに書かれていたコイツ。

// セッションから全データを削除
Session::flush(); 

消してるんかーーーい!!

f:id:agonosetaro:20200123142007p:plain:h200

おわり

上記のコードは不要だったみたく、結局消して解決。アゴ禿げそう

スポンサーリンク