VerifyCsrfToken.php 第 53 行 Laravel 5.1 中的 TokenMismatchException
TokenMismatchException in VerifyCsrfToken.php line 53 in Laravel 5.1
当我尝试登录时显示令牌错误。我已经在视图表单中检查了令牌,它是正确的,当评论 \App\Http\Middleware\VerifyCsrfToken::class
时,
在 Kernel.php
它让我登录但是在重定向到我的仪表板后我没有登录。我在 mac.
上使用 MAMP
<div>
<h1>Login</h1>
<div>
{!! Form::open(['url'=>'user/login','class' => '']) !!}
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<ul>
<li><label>Customer Code</label>{!!Form::Text('customer_code',Input::old('customer_code'),['class'=>''])!!}</li>
<li><label>Password</label>{!!Form::Password('password','',['class'=>''])!!}</li>
<li>{!! Form::submit('Submit',array('class' => 'btn')) !!}</li>
</ul>
{!!Form::close()!!}
</div>
<div><a href="{!!URL::to('user/forget_password')!!}">Forget Password</a></div>
</div>
同时我使用 Sentry Package
登录。
/**
* post_login
*/
public function post_login()
{
try
{
$rules = [
'customer_code' => 'required',
'password' => 'required',
] ;
$message = [
'customer_code.required' => 'erorrr1',
'password.required' =>'error2'
];
$validator = Validator::make(Input::all(), $rules,$message);
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput();
} // if ($validator->fails())
else
{
$authUser = Sentry::authenticateAndRemember(array(
'customer_code' => Input::get('customer_code'),
'password' => Input::get('password')), false);
if($authUser)
{
//$login = Sentry::loginAndRemember($authUser);
return Redirect::to('user/panel/'.$authUser->id)->with('comment', 'Welcome');
}
else
{
return Redirect::back()->with('comment', 'Error for login');
}
}//validator
}
catch(\Exception $e)
{
return Redirect::back()->withInput(Input::except('password','file'))->withErrors(['ERROR!!!!!']);
}
}
已编辑:
由于您使用的是表单生成器,因此请将其从您的表单中删除。 Laravel 当您执行 Form::open()
时,表单生成器会自动向您的表单添加一个隐藏的令牌字段
所以删除这一行:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
您没有 post 您的问题中的示例代码。
因此请使用以下选项检查您的代码,
尝试使用隐藏的输入字段值:
{!! csrf_token() !!} or {{ csrf_token() }}
您还可以使用表单 blade 模板:
{!! Form::open(array('method' => 'GET/POST','url' => 'YOUR_URL',)) !!}
这将自动在您的 html 脚本中添加 CSRF 代码
在 <head>
部分中还包括一件事:
<meta name="csrf-token" content="{{ csrf_token() }}">
全新安装 Laravel 5.1,没有将 composer 从版本 5.0 更新到 5.1,我看到了一些差异,其中一个在 Middleware 文件夹中。
EncryptCookies.php是一个新的中间件,看看你有没有。
所以,我没有再次测试,目前我将我的文件从 5.0 版转移到新安装的 5.1 版,但我很确定这可以解决这个问题,EncryptCookies.php 在令牌不匹配错误的堆栈中。
我在尝试上传文件时也遇到了这个问题。原来 max_post_size 被超过了,在这种情况下,显然所有 POST 变量都被清除,因此没有收到令牌。
好吧,我想所有人都错过了注销时创建 CSRF 令牌!
因为我已经解决了问题。
只需将以下代码添加到 header。
<meta name="csrf-token" content="{{ csrf_token() }}">
<script type=text/javascript>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
如果您使用 {!!Form::open()!!}
,它会自动创建令牌。否则你可以使用
<input type="hidden" name="_token" id="_token" value="{!! $csrf_token !!}}" />
或
{!! csrf_field() !!}
只是立即打开表格。
最重要的是在控制器功能上使用 return Redirect::to('');
或页面重新加载或 ajax 重新加载可以创建令牌!
喜欢:
public function logout() {
Session::flush();
Auth::logout();
return Redirect::to('/');
}
为确保令牌正确创建或未在浏览器上检查 "view page source",它将显示如下:
<meta name="csrf-token" content="TbgWTQZhTv0J4eFBQNU4rlM3jOlmBeYlTgf0waZB">
<script type=text/javascript>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
<form method="POST" action="/login-process" accept-charset="UTF-8" class="form-inline"><input name="_token" type="hidden" value="TbgWTQZhTv0J4eFBQNU4rlM3jOlmBeYlTgf0waZB">
我认为它可能会解决问题,因为它对我有用!
在表格旁边添加 <?php echo Form::token(); ?>
。
这个解决方案对我有用:
在表单的任意位置添加 {{ csrf_field() }}
。
从 Kernel.php
中的 $middleware
中删除 App\Http\Middleware\VerifyCsrfToken::class
。
我使用了以下代码。它运行良好。
<?php echo csrf_token(); ?>
我遇到了同样的问题。我正在使用 Laravel 5.1.28、php 5.6.13
在 VerifyCsrfToken 中看到 TokenMismatchException 后,我在网上搜索了答案,但 none 解决了我的问题。
页面确实发送了令牌。令牌值也可以在目录 storage/framework/sessions 的会话文件中看到(我禁用了加密才能看到它)。
筋疲力尽,我重新安装 laravel 并使用简单的形式进行测试 - 它没有令牌不匹配错误。
将我的代码一点一点移到新安装的laravel中,我终于找到了
问题是由 doctrine/dbal 引起的(我仍然不知道为什么)。
将其从 composer.json 中删除,问题消失了。
在 composer.json 中,出现以下行的令牌不匹配错误:
"require": {
....
"doctrine/dbal": "^2.5"
...
},
你的情况可能不同,但你可能想看看你是否改变了什么
composer.json 可能是导致问题的原因。
添加 {!! csrf_field() !!}
解决了我的问题,如下所示:
<form action="#" method="post" class="form-horizontal" role="form">
{!! csrf_field() !!}
</form>
如果使用 Laravel 表单助手,如下所示:
{!! Form::open(array('class' => 'form-horizontal', 'role' => 'form')) !!}
CSRF 代码将自动添加到您的 html 脚本中。还要确保在浏览器中查看源代码,以确保确实添加了如下所示的字段。
<input type="hidden" name="_token" value="dHWBudjTyha9AMr0SuV2ABq5NNK6bTIDZDXRWCBA">
我在使用这段代码时遇到了同样的问题
<input type="hidden" name="_token" value="{!! csrf_token() !!}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
通过将其更改为 {!! csrf_field() !!}
解决了我的问题
i'm on L5.1
对我有用。
<meta name="csrf-token" content="{{ csrf_token() }}" />
<script>
function getMessage(){
$.ajax({
headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
type:'POST',
url:'/getmsg',
// data:'_token = <?php echo csrf_token() ?>',
success:function(data){
$("#msg").html(data.msg);
}
});
}
</script>
{{ Form::button('Replace Message',['onClick'=>'getMessage()']) }}
当我尝试登录时显示令牌错误。我已经在视图表单中检查了令牌,它是正确的,当评论 \App\Http\Middleware\VerifyCsrfToken::class
时,
在 Kernel.php
它让我登录但是在重定向到我的仪表板后我没有登录。我在 mac.
<div>
<h1>Login</h1>
<div>
{!! Form::open(['url'=>'user/login','class' => '']) !!}
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<ul>
<li><label>Customer Code</label>{!!Form::Text('customer_code',Input::old('customer_code'),['class'=>''])!!}</li>
<li><label>Password</label>{!!Form::Password('password','',['class'=>''])!!}</li>
<li>{!! Form::submit('Submit',array('class' => 'btn')) !!}</li>
</ul>
{!!Form::close()!!}
</div>
<div><a href="{!!URL::to('user/forget_password')!!}">Forget Password</a></div>
</div>
同时我使用 Sentry Package
登录。
/**
* post_login
*/
public function post_login()
{
try
{
$rules = [
'customer_code' => 'required',
'password' => 'required',
] ;
$message = [
'customer_code.required' => 'erorrr1',
'password.required' =>'error2'
];
$validator = Validator::make(Input::all(), $rules,$message);
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput();
} // if ($validator->fails())
else
{
$authUser = Sentry::authenticateAndRemember(array(
'customer_code' => Input::get('customer_code'),
'password' => Input::get('password')), false);
if($authUser)
{
//$login = Sentry::loginAndRemember($authUser);
return Redirect::to('user/panel/'.$authUser->id)->with('comment', 'Welcome');
}
else
{
return Redirect::back()->with('comment', 'Error for login');
}
}//validator
}
catch(\Exception $e)
{
return Redirect::back()->withInput(Input::except('password','file'))->withErrors(['ERROR!!!!!']);
}
}
已编辑:
由于您使用的是表单生成器,因此请将其从您的表单中删除。 Laravel 当您执行 Form::open()
所以删除这一行:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
您没有 post 您的问题中的示例代码。
因此请使用以下选项检查您的代码,
尝试使用隐藏的输入字段值:
{!! csrf_token() !!} or {{ csrf_token() }}
您还可以使用表单 blade 模板:
{!! Form::open(array('method' => 'GET/POST','url' => 'YOUR_URL',)) !!}
这将自动在您的 html 脚本中添加 CSRF 代码
在 <head>
部分中还包括一件事:
<meta name="csrf-token" content="{{ csrf_token() }}">
全新安装 Laravel 5.1,没有将 composer 从版本 5.0 更新到 5.1,我看到了一些差异,其中一个在 Middleware 文件夹中。
EncryptCookies.php是一个新的中间件,看看你有没有。
所以,我没有再次测试,目前我将我的文件从 5.0 版转移到新安装的 5.1 版,但我很确定这可以解决这个问题,EncryptCookies.php 在令牌不匹配错误的堆栈中。
我在尝试上传文件时也遇到了这个问题。原来 max_post_size 被超过了,在这种情况下,显然所有 POST 变量都被清除,因此没有收到令牌。
好吧,我想所有人都错过了注销时创建 CSRF 令牌!
因为我已经解决了问题。
只需将以下代码添加到 header。
<meta name="csrf-token" content="{{ csrf_token() }}">
<script type=text/javascript>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
如果您使用 {!!Form::open()!!}
,它会自动创建令牌。否则你可以使用
<input type="hidden" name="_token" id="_token" value="{!! $csrf_token !!}}" />
或
{!! csrf_field() !!}
只是立即打开表格。
最重要的是在控制器功能上使用 return Redirect::to('');
或页面重新加载或 ajax 重新加载可以创建令牌!
喜欢:
public function logout() {
Session::flush();
Auth::logout();
return Redirect::to('/');
}
为确保令牌正确创建或未在浏览器上检查 "view page source",它将显示如下:
<meta name="csrf-token" content="TbgWTQZhTv0J4eFBQNU4rlM3jOlmBeYlTgf0waZB">
<script type=text/javascript>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
<form method="POST" action="/login-process" accept-charset="UTF-8" class="form-inline"><input name="_token" type="hidden" value="TbgWTQZhTv0J4eFBQNU4rlM3jOlmBeYlTgf0waZB">
我认为它可能会解决问题,因为它对我有用!
在表格旁边添加 <?php echo Form::token(); ?>
。
这个解决方案对我有用:
在表单的任意位置添加 {{ csrf_field() }}
。
从 Kernel.php
中的 $middleware
中删除 App\Http\Middleware\VerifyCsrfToken::class
。
我使用了以下代码。它运行良好。
<?php echo csrf_token(); ?>
我遇到了同样的问题。我正在使用 Laravel 5.1.28、php 5.6.13
在 VerifyCsrfToken 中看到 TokenMismatchException 后,我在网上搜索了答案,但 none 解决了我的问题。
页面确实发送了令牌。令牌值也可以在目录 storage/framework/sessions 的会话文件中看到(我禁用了加密才能看到它)。
筋疲力尽,我重新安装 laravel 并使用简单的形式进行测试 - 它没有令牌不匹配错误。
将我的代码一点一点移到新安装的laravel中,我终于找到了 问题是由 doctrine/dbal 引起的(我仍然不知道为什么)。
将其从 composer.json 中删除,问题消失了。
在 composer.json 中,出现以下行的令牌不匹配错误:
"require": {
....
"doctrine/dbal": "^2.5"
...
},
你的情况可能不同,但你可能想看看你是否改变了什么 composer.json 可能是导致问题的原因。
添加 {!! csrf_field() !!}
解决了我的问题,如下所示:
<form action="#" method="post" class="form-horizontal" role="form">
{!! csrf_field() !!}
</form>
如果使用 Laravel 表单助手,如下所示:
{!! Form::open(array('class' => 'form-horizontal', 'role' => 'form')) !!}
CSRF 代码将自动添加到您的 html 脚本中。还要确保在浏览器中查看源代码,以确保确实添加了如下所示的字段。
<input type="hidden" name="_token" value="dHWBudjTyha9AMr0SuV2ABq5NNK6bTIDZDXRWCBA">
我在使用这段代码时遇到了同样的问题
<input type="hidden" name="_token" value="{!! csrf_token() !!}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
通过将其更改为 {!! csrf_field() !!}
解决了我的问题
i'm on L5.1
对我有用。
<meta name="csrf-token" content="{{ csrf_token() }}" />
<script>
function getMessage(){
$.ajax({
headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
type:'POST',
url:'/getmsg',
// data:'_token = <?php echo csrf_token() ?>',
success:function(data){
$("#msg").html(data.msg);
}
});
}
</script>
{{ Form::button('Replace Message',['onClick'=>'getMessage()']) }}