【问题标题】:Laravel 5.2 token mismatchLaravel 5.2 令牌不匹配
【发布时间】:2016-10-24 18:38:52
【问题描述】:

我正在将 Laravel 5.1 网站更新为 Laravel 5.2.39。我在“已批准”的升级过程(尤其是中间件)方面遇到了很多问题,所以我最终创建了一个新的 Laravel 5.2 站点,只是从旧站点转移了我的视图、模型和控制器。它似乎正在工作,除非我提交任何表单时出现令牌不匹配异常:

TokenMismatchException in VerifyCsrfToken.php line 67:

我的表单中有令牌(使用{{ csrf_field() }}):

<div class="form-group">
    {!! Form::label('name', 'Name') !!}
    {!! Form::text('name', old('name'), ['placeholder' => 'Name', 'class' => 'form-control']) !!}
</div>
<div class="form-group">
    {!! Form::label('email', 'Email') !!}
    {!! Form::email('email', old('email'), ['placeholder' => 'Email', 'class' => 'form-control']) !!}
</div>
<div class="form-group">
    {!! Form::label('phone', 'Phone') !!}
    {!! Form::text('phone', old('phone'), ['placeholder' => 'Phone', 'class' => 'form-control']) !!}
</div>
{{ csrf_field() }}
<div class="form-group">
    {!! Form::submit('Submit', ['class' => 'btn btn-default btn-small']) !!}
    <input type="reset" class="btn btn-primary btn-small" />
</div>

我已经清除了我的 cookie,还尝试将 config/session.php lifetime 设置为更高的数字,以确保它不会超时。

这是在宅基地箱上运行的。

有什么想法可以尝试吗?

编辑:这是有问题的路线

Route::resource('contact', 'ContactController');

EDIT2:这是路由文件。我不认为在 Laravel 5.2 中将路由包装在 Web 中间件中是必需的——但是,我已经尝试了两种方法,但出现了同样的错误。

Route::group(['middleware' => ['web']], function () {

    Route::get('/', 'AccountController@index');

    Route::resource('account', 'AccountController');
    Route::resource('contact', 'ContactController');

});

在控制器的创建操作中转储$request-&gt;session()-&gt;token() 会在带有表单的页面上显示当前会话令牌。这与添加到表单中的标记相同(使用查看源检查)。

但是当它到达Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::tokensMatch() 类时,我转储了会话令牌,它与表单令牌不同——这意味着它们永远不会匹配。不确定这里会发生什么。

【问题讨论】:

  • 能否请您出示您在该论坛的POST 路线?
  • @xdevnull-- 它在 resource 路线上,但我会编辑我的答案。谢谢
  • @user101278 他们在Web Group Middleware下吗?
  • @xdevnull-- 不,目前只有 4 条资源路由,没有一个在一个组中,也没有一个显式附加中间件。我以为5.2中的web中间件是自动应用的?
  • 版本 > 5.2.28

标签: php laravel laravel-5.2 token csrf


【解决方案1】:

只要您有 Form:open 声明,就不再需要单独的 csrf_field 行。 Form::open 应该照顾它。

你使用的是 laravel 集体表单包吗?旧的发光包不再维护。

正如之前的用户所说,所有路由也必须包装在 web 中间件组中,这也可能是问题。

【讨论】:

  • 是的,这是 laravel 集体包。
  • 上面的表单示例没有显示表单打开和关闭声明。它是刚刚从您的示例代码中遗漏了还是丢失了?
  • 是的,这只是一部分。表单工作正常,如果我在中间件中禁用令牌检查,我可以验证令牌有效负载是否正在到达控制器的 store 操作
【解决方案2】:

这真的很烦人,但在所有其他事情之后,这似乎是一个奇怪的错误,由一个 Homestead 盒子上的多个 Laravel 站点引起。我设置了不同的会话密钥并清除了缓存,但它仍然无法正常工作。

摧毁宅基地箱并重建它似乎已经解决了这个问题。感谢所有 cmets 并尝试寻找解决方案。

【讨论】:

    【解决方案3】:

    将您的路由放置在网络中间件中。或在App\http\kernel 中将所有路由从网络复制到受保护的$middleware 数组。

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2017-05-13
      • 2020-07-08
      • 2016-09-20
      • 2020-01-20
      • 2017-05-23
      • 2016-12-06
      • 2020-06-17
      相关资源
      最近更新 更多