🍪
[Laravel] 最も簡単で最も難しい419エラーの解決策
419エラー
Laravelを嗜んだことがある人であれば、419エラー(page expired)とはお友達という方が多いと思います。
私もその一人ですでした。
419エラーは、CSRF (Cross-Site Request Forgery) トークンの検証が失敗したときに発生します。
このエラーは、Webアプリケーションが不正なリクエストから保護するためのセキュリティ対策の一環として発生します。
一般的な419エラーの解決策
以下の部分を見直せば大抵直ります。
- <form>タグの中に、
@csrf
を入れる - ajax通信時に利用する用に、<head>タグの中に
<meta name="csrf-token" content="{{ csrf_token() }}">
を入れる -
\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_session
やXSRF-TOKEN
といったCookieがブラウザ側にセットされず、毎回フォーム送信するたびにセッションを作り直すので、フォームから送ったCSRFトークンとセッションのCSRFトークンの値が一致せず419エラーが出ていました。
<?php
を1行目に修正すると、何食わぬ顔でlaravel_session
とXSRF-TOKEN
がブラウザのCookie欄に顔を出しました。
修正内容としては、最も簡単ですが、思いつくのは最も難しい内容だったと思います。
419エラーを侮ることなかれ。。。
この記事がどなたかの助けになれば幸いです。
私のように貴重な3時間をこんな簡単なことに溶かさないでほしい。。。
Discussion