【问题标题】:TokenMissmatchException in VerifyCSRFTokenVerifyCSRFToken 中的 TokenMissmatchException
【发布时间】:2016-12-26 13:29:02
【问题描述】:

我有一个问题似乎在 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>

我尝试了什么

使用&lt;input type="hidden" name="_token" value="{{ csrf_token() }}"&gt; 代替字段。
使用 {!! 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 请求),然后按提交登录,我就会收到上述异常。

【问题讨论】:

  • 您使用的是什么会话驱动程序?
  • 我使用file 进行会话和缓存。我什至用rm -f storage/framework/sessions/*删除了会话缓存
  • 您在渲染的 html 中看到 _token 字段了吗?你能把这个也发一下吗?
  • 请检查视图中的 csrf 令牌: 另外,请确保您拥有 .使用密钥解决的 env 文件:php artisan key:generate
  • 我在 HTML 中看到了令牌。这是请求中的那个。我还有一个带有 generate 的键集

标签: php laravel laravel-5.2 csrf


【解决方案1】:

您需要将“Route::post('/login', ......”放入 ['middleware' => ['guest']] 而不是 ['middleware' => ['网络']]

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

【讨论】:

  • 您是否将所有路线都保留在“网络”组之外? : /
  • 我只有三个路由,现在都在guest组中
  • 目前,您可以在您的app/Http/Kernel.php 文件夹中评论“\App\Http\Middleware\VerifyCsrfToken::class”,稍后会为您提供解决方案
【解决方案2】:

“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

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2014-10-26
    • 1970-01-01
    • 2015-03-11
    • 2015-11-14
    • 2016-11-19
    • 2017-01-20
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多