Help us understand the problem. What is going on with this article?

【Laravel】TokenMismatchExceptionが発生する原因

More than 1 year has passed since last update.

TokenMismatchExceptionが発生する原因

フォーム等でPOSTをする際、Laravel が発行するCSRFトークンが必要で、
そのトークンがないと表題のTokenMismatchExceptionが発生するようになります。
(詳しくはリーダブル参照: CSRF保護 5.4 Laravel

以下のコードをブレードのformタグ内に埋め込む必要があります。

blade.php
{{ csrf_field() }}

以下Laravel5.6以前の記述例

form.blade.php
<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

以下Laravel5.6系以降の記述例

form.blade.php
<form method="POST" action="/profile">
    @csrf
    ...
</form>

HTMLのソースでは↓のように表示されます

<input type="hidden" name="_token" value="DC83jdkaHfAlskdjvskjiSVHEcrvzNK2fjcjpa3s*****">

逆に言うとTokenMismatchExceptionが発生する場合、作成したフォーム要素内にCSRFトークンが埋め込まれてない可能性大です

TokenMismatchException発生時の挙動制御

\app\Exceptions\Handler.phprenderメソッドで挙動を制御できます。

Handler.php
/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
 {
    // TokenMismatchException発生時
    if ($exception instanceof TokenMismatchException) {
        // TokenMismatchException発生時はindexへリダイレクトさせる
        return redirect('/index');
    }
    return parent::render($request, $exception);
}

設定したことを忘れないようにしてください。
(403エラーページなどに飛ばした方がいいのかもしれません。)

有効期限

defaultで120分(2時間)みたいです。

config/session.php
    /*
    |--------------------------------------------------------------------------
    | Session Lifetime
    |--------------------------------------------------------------------------
    |
    | Here you may specify the number of minutes that you wish the session
    | to be allowed to remain idle before it expires. If you want them
    | to immediately expire on the browser closing, set that option.
    |
    */

    'lifetime' => 120,

    'expire_on_close' => false,
sola-msr
ミセ*゚ー゚)リ そんな事言われてもウチ、ポン・デ・ライオンやし
andfactory
Smartphone Idea Companyとして、人々の生活に「&(アンド)」を届ける。
https://andfactory.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした