私の登録ページは、フォーム内にCsrfToken({{ csrf_field() }}
)が存在する状態でフォームを正しく表示しています。
フォームHTML
<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
{{ csrf_field() }}
....
</form>
ユーザーに作り付けの認証を使用しています。ルートとリダイレクト以外は何も変更していません。
フォームを送信すると(再ロード直後も)、 非アクティブのためページが期限切れになりました。更新してもう一度やり直してください。 エラー。
私は私が非常に小さなことを見逃しています。しかし、それが何であるかわからない。何か手助け?
更新
問題を見つけました。セッションドライバは配列に設定されました。ファイルに変更し、エラーはなくなりました。しかし、私は配列を使用した場合何が問題になりますか?
あなたが検索から直接この回答にたどり着いている場合、OPのように{{ csrf_field() }}
であなたのフォームにcsrfトークンをすでに追加していることを確認してください。
セッションドライバがfileに設定されている場合
Storage_pathが書き込み可能ではないことと関係があるかもしれません。ファイルベースのセッションを使用している場合は、これがトークンに関するセッションデータを格納する場所です。これはis_writable(config('session.files'))
で検証できます
OPの場合、セッションドライバは配列に設定されています。配列はテスト専用です。データは永続化されていないため、次の要求でトークンを比較することはできません。
アレイドライバはテスト中に使用され、セッションに格納されているデータが保持されないようにします。
https://laravel.com/docs/5.5/session#configuration
チェックconfig/sessions.php
最後に、私が今抱えていた問題は、config/session.phpにセッションドメインと安全な設定を持つプロジェクトがありましたが、開発サイトはHTTPS(SSL/TLS)を使っていませんでした。 sessions.secureがデフォルトでtrueに設定されていたため、これはこの一般的なエラーを引き起こしました。
私はLaravel 5.5でも同じ問題に遭遇しました。私の場合は、ルートをGETからPOSTに変更した後に発生しました。問題は、POSTに切り替えたときにCSRFトークンを渡すのを忘れたためです。
次のように呼び出して、CSRFトークンをフォームに投稿することができます。
{{ csrf_field() }}
またはapp/Http/Middleware/VerifyCsrfToken.phpでルートを除外してください
protected $except = [
'your/route'
];
全部試してみてください。
composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
これは、Illuminate\Session\TokenMismatchException
がこのコードサンプルを見て正しく処理する方法が原因で発生します。
私のケースはSESSION_DOMAIN
で解決されました、私のローカルマシンはxxx.localhost
に設定されなければなりませんでした。 session.php設定ファイルで直接設定されている本番用のSESSION_DOMAIN
、xxx.com
と衝突していました。
いくつかの情報は開発中のlaravelの以前のバージョンに関連するcookieに格納されています。そのため、他のバージョンによって生成されたcsrf生成トークンと競合しています。ただクッキーをクリアしてみてください。
まだ問題があって何も助けにならなかった人々のために。 php.iniのmbstring.func_overloadパラメータに注意してください。 0に設定する必要があります。そしてmbstring.internal_encodingをUTF-8に設定します。私の場合はそれが問題でした。
許可をストレージに変更してエラーがなくなりました。許可がないことが問題だったようです。
Sudo chmod -R 775 storage/
私の場合、サイトはサーバーでは問題ありませんでしたが、ローカルでは問題ありませんでした。それから私は安全なウェブサイトに取り組んでいたことを覚えています。
ファイルconfig.session.phpで、変数secureをfalseに設定します
'secure' => env('SESSION_SECURE_COOKIE', false),
私は同じ問題を抱えていましたが、問題はフレームワークではなくブラウザにあります。理由はわかりませんが、私の場合は、Google ChromeがCookieを自動的にブロックします。許可されたクッキーの後、問題は解決しました。
set mbstring.func_overload = 2
それは私を助けました
Webサーバーのシステム時刻が正しいことを確認してください。私の場合は、vagrantマシンが未来(Jan 26 14:08:26 UTC 2226)であったので、もちろん私のブラウザのセッションクッキーの時間は約200年以上前に期限切れになっていました。
私は複数のサブドメインを持つアプリを持っていて、セッションクッキーはそれらの間の問題でした。クッキーをクリアすることで私の問題は解決しました。
また、 .env ファイルにSESSION_DOMAIN
を設定してみてください。参照している正確なサブドメインを使用してください。
短い答え
app/Http/Middleware/VerifyCsrfToken.php
にregister
のルートエントリを追加します
protected $except = [
'/routeTo/register'
];
コマンドを使用してキャッシュとキャッシュルートをクリアします。
php artisan cache:clear && php artisan route:clear
詳細
Laravelサイトにアクセスするたびに、セッションが開始されていなくてもトークンが生成されます。次に、各リクエストで、このトークン(Cookieに格納されている)は、SESSION_LIFETIME
ファイルのconfig/session.php
フィールドに設定された有効期限に対して検証されます。
有効期限を超えてサイトを開いたままにしてリクエストを試みると、このトークンが評価され、有効期限エラーが返されます。そのため、認証されたユーザーの機能(登録やログインなど)の外部にあるフォームでこの検証をスキップするには、app/Http/Middleware/VerifyCsrfToken.php
に除外ルートを追加できます。
私はこれらのエラーを回避するための2つの解決策を考え出しました。 2)カーネル内の保護されたミドルウェアグループに\ App\Http\Middleware\VerifyCrfToken :: class行をコメントアウト