VerifyCSRFToken中的TokenMissmatchException

时间:2016-08-19 11:39:18

标签: php laravel laravel-5.2 csrf

我有一个似乎在Laravel中重新出现的问题,但我无法修复它。当我尝试使用我的表单登录时,我得到了例外

TokenMismatchException in VerifyCsrfToken.php line 67:

我的代币是

57APQblkHvu9zZAMEdLYqQ1EwhPgZZtv4xEAYqmG // Request
byHXGzrMeMQGPtIBWo6FCgdKyXl2GkiekQk8IEND // Session

但他们为什么不同?我的登录表单如下所示,是视图中唯一的HTML代码。

<form method="post" action="{{ route('login.do') }}">
    <input type="submit" value="Login with Spotify">
    {{ csrf_field() }}
</form>

我尝试了什么

使用<input type="hidden" name="_token" value="{{ csrf_token() }}">代替字段。
使用{!! csrf_field() !!}代替{{ csrf_field() }}
将我的所有路由分组到web中间件

<?php

Route::group(['middleware' => ['web']], function () {
    Route::get(
        '/',
        [
            'as' => 'start',
            'uses' => 'HomeController@index'
        ]
    );

    Route::get(
        '/login',
        [
            'as' => 'login.show',
            'uses' => 'AuthenticationController@login'
        ]
    );

    Route::post(
        '/login',
        [
            'as' => 'login.do',
            'uses' => 'AuthenticationController@doLogin'
        ]
    );
});

但是一旦我在login.blade.php(GET请求),然后按提交登录我就会收到上述异常。

2 个答案:

答案 0 :(得分:1)

你需要把你的“Route :: post('/ login',......”放在['middleware'=&gt; ['guest']]而不是['middleware'=&gt; [ '卷筒纸']]

在['middleware'=&gt;之外保留所有“登录前活动” ['web']]组,因为['middleware'=&gt; ['web']]执行会话,cookie和csrf等。用户登录laravel web-app后需要处理的东西

答案 1 :(得分:0)

VerifyCsrfToken.php第67行中'TokenMismatchException背后的原因:'可能非常复杂。理解所涉及的中间件是必要的。下图显示了重要的详细信息。Laravel Middleware for token(cookie) verification Diagram

每个请求都遍历StartSession和VerifyXsrfToken层。它们分别管理名为'laravel_session'和'XSRF_token'的cookie。它们按此顺序进行检查,两者都至关重要。如果任一cookie未通过验证,则抛出'TokenMismatchException'。 更多详情请见Full details of Laravel middleware re TokenMismatchException in VerifyCsrfToken