#TL;DR
VARCHAR(255)
(NOT NULLと主キー制約付き)でした。
#前提
- Laravel Valetで開発環境を構築しています(Docker不使用)
- Laravel 8.41.0
- PHP 8.0.8
- Nginx 1.21.1
- macOS Big Sur 11.4
- Laravel Fortifyの認証機能を使用しています
- .envファイルにて
SESSION_DRIVER=database
にしています。 - .envファイルにて
APP_DEBUG=false
にしています。 - データベースmigrationに、Laravel純正のものではなくridgepoleを使用しています
事の発端
本番環境を構築してログインページからフォームのPOSTを送ったところ下記の画面が表示されました。
419|期限切れのページ
「Laravelで419応答ならリクエストにCSRFトークンが含まれていない(例)」というのがよく言われている原因です。
しかし、実際にはCSRFトークン付きでPOSTリクエストを送信しています。
ここで小一時間悩みました。
解決に至るまでの過程
正常にログイン出来る試験環境と、問題が発生している本番環境との差を確認していったところ
sessions
テーブルのid
列の型が
試験環境→VARCHAR(255)
本番環境→BIGINT(2O)
と違いがあり、試験環境のid
列には文字列が入っていました。
下記SQL文を実行して本番環境のid
列の型を変更したところ、419応答が無くなり、無事ログインできるようになりました。
ALTER TABLE `データベース名`.`sessions` CHANGE COLUMN `id` `id` VARCHAR(255) NOT NULL;
BIGINT(2O)
としてid
列の型が作成された理由は、ridgepoleでのmigrationをデフォルトのまま使用したためです。
しくじりの理由
「データベース起因のエラーならSQLSTATE
で始まるエラーが返ってくるのが普通」
「idという列名なら数値以外のデータ型はあり得ない」
と言う思い込みが、問題解決までの道のりを遠ざけていました💦
最後に
マサカリ大歓迎です。
よろしければ、LGTMボタンを押して行ってくださいね🌟
見出しの出典
これまでのしくじり
Laravelしくじり先生その1『(型宣言を)「ガチガチにやらなきゃモチモチにならない」と言ったな。あれはやり過ぎ注意だ。』