現象
LaravelにBreezeで追加したログイン機能
ログインボタン押下時に419画面へ遷移してしまう。
環境
Laravel 10.41.0
Breeze 1.28.1
原因
1度目のログインボタンクリックにより、CSRFトークンが送信される。
2度目のログインボタンクリックにより、先ほどと同じCSRFトークンが送信される。
このCSRFトークンは使用済みのため、不正なトークンと判定されて419画面へ遷移してしまう。
今回自分が遭遇したケースは、breezeで自動生成したログイン機能が、ボタン連打を考慮していない作りだったのが原因と考えています。
解決した方法
以下のJSを追記
formのsubmitをトリガーに、ログインボタンをdisabledにするように修正
document.getElementById('login-form').addEventListener('submit', function() {
document.getElementById('login-button').setAttribute('disabled', 'disabled');
});
注意
Laraveで419画面へ遷移してしまう現象の中で、今回のケースは多分稀なタイプです。
以下の記事によく遭遇しそうな内容が記述されているので、今回のケースと一致しなかった方はそちらを参考にしてみてください。
【 Laravel】419セッションエラーの原因と対策をすべて網羅。token miss match. 419 Sorry, your session your page has expired
参考にしたURL
Laravel】@csrfディレクティブがあるのに419エラーが発生する【Android Chrome】
419 Login Link Expired Errors - On mobile only?