Laravel 5.2 令牌不匹配
Laravel 5.2 token mismatch
我正在将 Laravel 5.1 站点更新为 Laravel 5.2.39。我在 "approved" 升级过程(尤其是中间件)中遇到了很多问题,所以我最终创建了一个新的 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 中将路由包装在网络中间件中——但是,我已经尝试了两种方法,但都出现了同样的错误。
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()
class 时,我转储了会话令牌,它与表单令牌不同——这意味着它们永远不会匹配。不确定这里会发生什么。
只要您有 Form:open
声明,就不再需要单独的 csrf_field 行。 Form::open
应该处理一下。
您使用的是 laravel 集体表格包吗?不再维护旧的 illuminate 包。
正如之前的用户所说,所有路由也必须包装在 web 中间件组中,这也可能是问题所在。
将您的路由放在网络中间件中。或者在 App\http\kernel
中将所有路由从 web 复制到受保护的 $middleware
数组。
这真的很烦人,但在其他一切之后,这似乎是一个奇怪的错误,由一个 Homestead 框上的多个 Laravel 站点引起。我以不同方式设置了 session 密钥并清除了缓存,但它仍然无法正常工作。
销毁 homestead 盒子并重建它似乎解决了这个问题。感谢所有评论和寻找解决方案的尝试。
我正在将 Laravel 5.1 站点更新为 Laravel 5.2.39。我在 "approved" 升级过程(尤其是中间件)中遇到了很多问题,所以我最终创建了一个新的 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 中将路由包装在网络中间件中——但是,我已经尝试了两种方法,但都出现了同样的错误。
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()
class 时,我转储了会话令牌,它与表单令牌不同——这意味着它们永远不会匹配。不确定这里会发生什么。
只要您有 Form:open
声明,就不再需要单独的 csrf_field 行。 Form::open
应该处理一下。
您使用的是 laravel 集体表格包吗?不再维护旧的 illuminate 包。
正如之前的用户所说,所有路由也必须包装在 web 中间件组中,这也可能是问题所在。
将您的路由放在网络中间件中。或者在 App\http\kernel
中将所有路由从 web 复制到受保护的 $middleware
数组。
这真的很烦人,但在其他一切之后,这似乎是一个奇怪的错误,由一个 Homestead 框上的多个 Laravel 站点引起。我以不同方式设置了 session 密钥并清除了缓存,但它仍然无法正常工作。
销毁 homestead 盒子并重建它似乎解决了这个问题。感谢所有评论和寻找解决方案的尝试。