🍪

[Laravel] 最も簡単で最も難しい419エラーの解決策

2024/04/22に公開

419エラー

Laravelを嗜んだことがある人であれば、419エラー(page expired)とはお友達という方が多いと思います。
私もその一人ですでした。

419エラーは、CSRF (Cross-Site Request Forgery) トークンの検証が失敗したときに発生します。
このエラーは、Webアプリケーションが不正なリクエストから保護するためのセキュリティ対策の一環として発生します。

一般的な419エラーの解決策

以下の部分を見直せば大抵直ります。

  1. <form>タグの中に、@csrfを入れる
  2. ajax通信時に利用する用に、<head>タグの中に<meta name="csrf-token" content="{{ csrf_token() }}">を入れる
  3. \Illuminate\Session\Middleware\StartSession::classが作動しているか確認する

最も簡単で最も難しい419エラーの解決策

今回の私のケースは、上記の一般的なケースには当てはまりませんでした。

以下のファイルを見てもらうと、勘の良い方は原因がわかるかもしれません。。
私は3時間考えないと無理でした。。。

/config/stripe.php
1
2 <?php
3
4 return [
5   'stripe_api_key' => env('STRIPE_API_KEY'),
6   'stripe_api_secret' => env('STRIPE_API_SECRET'),
7 ];

その原因は、、、

<?phpが1行目に書かれていないこと


度肝抜かれましたね。
<?phpが2行目に書かれているおかげで、laravel_sessionXSRF-TOKENといったCookieがブラウザ側にセットされず、毎回フォーム送信するたびにセッションを作り直すので、フォームから送ったCSRFトークンとセッションのCSRFトークンの値が一致せず419エラーが出ていました。

<?phpを1行目に修正すると、何食わぬ顔でlaravel_sessionXSRF-TOKENがブラウザのCookie欄に顔を出しました。

修正内容としては、最も簡単ですが、思いつくのは最も難しい内容だったと思います。
419エラーを侮ることなかれ。。。

この記事がどなたかの助けになれば幸いです。
私のように貴重な3時間をこんな簡単なことに溶かさないでほしい。。。

Discussion