LaravelのBladeで作成した画面からPostして画面遷移する時に419エラーが出ることがあります。
おそらく多くの原因が「@csrf」のつけ忘れです。
@csrfのつけ忘れ
<h1>新規登録</h1>
<form action="store" method="POST">
@csrf
<p>タイトル</p>
<input type="text" name="title" maxlength="30"/>
<br/>
<p>サブタイトル</p>
<input type="text" name="subtitle" maxlength="30"/>
<br/>
<p>本文</p>
<textarea name="text" maxlength="600"></textarea>
<br/>
<input type="submit" value="登録" />
</form>
Postで送信する時はformタブの中で「@csrf」をつけましょう。
@csrfって何かと言うとトークンの値です。
トークンって何かと言うと、ランダムな文字列が自動で生成されています。
トークンを何に使用するかと言うと、正常なPostリクエストなのかどうかを判定します。判定する方法はセッションにあるトークンとPostされるトークンが一致しているかを見ます。
@csrfをつけることでセッションにトークンを保存しリクエストでトークン値を送信することをLaravelがやってくれます。
試しにリクエストの値をdd()でデバックしてみてみます。
Illuminate\Http\Request {#44 ▼
+attributes: Symfony\Component\HttpFoundation\ParameterBag {#46 ▶}
+request: Symfony\Component\HttpFoundation\InputBag {#45 ▼
#parameters: array:4 [▼
"_token" => "JdyWn08T61LKTnE48ETIHSPgK4j6AVSU3GtycTec"
"title" => "あ"
"subtitle" => "あ"
"text" => "あ"
]
}
こんな形です。
title,subtitle,textは<input type=”text”>を作成していますが、_tokenは@csrfを付けるだけで自動で適当なトークン値を発行してリクエストしてくれます。
画面をしばらく更新せずに放置
先ほどセッションにトークン値が保存されると記載しましたがセッションは有効期限があり、しばらくするとセッションが消えます。
なので、しばらく放置している場合は画面更新してから動作させると良い場合があります。
コメント