首页 文章

Laravel 5.2令牌不匹配

提问于
浏览
1

我正在将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');

});

在控制器的create操作中转储 $request->session()->token() 会在页面上显示当前会话令牌和表单 . 这与添加到表单的标记相同(使用视图源检查) .

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

3 回答

  • 0

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

  • 0

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

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

  • 0

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

    您使用laravel集体表格包吗?旧的照明包不再维护 .

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

相关问题