Laravel 5.2令牌不匹配

时间:2016-06-22 17:16:48

标签: php laravel laravel-5.2 token csrf

我将Laravel 5.1网站更新为Laravel 5.2.39。我和#34;批准的"有很多问题。升级过程(特别是中间件)所以我最终创建了一个新的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->session()->token()转储到控制器的创建操作中,会在页面上显示当前会话令牌。这与添加到表单的标记相同(使用视图源检查)。

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

3 个答案:

答案 0 :(得分:1)

这真的很烦人,但是在其他一切之后,这似乎是由一个Homestead盒子上的多个Laravel站点引起的奇怪错误。我以不同的方式设置了会话密钥,并清除了缓存,但它仍然无效。

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

答案 1 :(得分:0)

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

您使用的是laravel集体表格套餐吗?旧的照明包不再维护。

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

答案 2 :(得分:0)

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