Laravel 5.1 中的 VerifyCsrfToken.php 第 53 行中的 TokenMismatchException
Posted
技术标签:
【中文标题】Laravel 5.1 中的 VerifyCsrfToken.php 第 53 行中的 TokenMismatchException【英文标题】:TokenMismatchException in VerifyCsrfToken.php line 53 in Laravel 5.1 【发布时间】:2015-09-05 05:53:48 【问题描述】:当我尝试登录时显示令牌错误。我已经在视图中检查了令牌,它是正确的,当评论 \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!!!!!']);
【问题讨论】:
显示你想出的代码?需要更多信息? 你是如何生成令牌的?显示代码。 确保在视图中的表单上设置令牌;最好在隐藏字段中 reza 您的表单的“方法”在哪里????这是一个 GET 请求吗?请向我们展示您的身份验证逻辑和重定向。 我认为它默认有POST方法。需要手动设置吗? 【参考方案1】:已编辑:
由于您使用的是表单生成器,因此请从表单中删除它。 Laravel 表单构建器会在您执行 Form::open()
时自动将隐藏的令牌字段添加到您的表单中
所以删除这一行:
<input type="hidden" name="_token" value=" csrf_token() ">
【讨论】:
我已经使用了这个脚本,但是没有用。我的表单中有令牌。 在您编辑问题后,我注意到您正在添加到令牌字段。请检查我编辑的答案【参考方案2】:您没有在问题中发布示例代码。
因此,请使用以下选项检查您的代码,
尝试隐藏输入字段值:
!! csrf_token() !! or csrf_token()
您也可以使用表单刀片模板:
!! Form::open(array('method' => 'GET/POST','url' => 'YOUR_URL',)) !!
这将自动在您的 html 脚本中添加 CSRF 代码
<head>
部分中要包含的另一件事是:
<meta name="csrf-token" content=" csrf_token() ">
【讨论】:
删除 CSRF 隐藏字段,因为您使用了 Form::open() CSRF 将被自动添加。您还需要将控制器方法名称更改为“postLogin”。【参考方案3】:全新安装 Laravel 5.1,不只是将 Composer 从 5.0 更新到 5.1,我在 Middleware 文件夹中发现了一些差异。
EncryptCookies.php 是一个新的中间件,请检查是否有。
所以,我没有再次测试,我现在将我的文件从 5.0 版转移到 5.1 版的新安装,但我很确定这可以解决这个问题,EncryptCookies.php 在令牌不匹配错误的堆栈。
【讨论】:
如果有人想从“authing”中排除一些路由,那么我建议去 app/Http/Middleware/VerifyCrsfToken.php 并添加 protected $except = [ 'route_1', 'route_1/*', ];【参考方案4】:我在尝试上传文件时也遇到了这个问题。原来 max_post_size 已超出,在这种情况下,显然所有 POST 变量都被清除,因此没有收到任何令牌。
【讨论】:
【参考方案5】:嗯,我想所有人都错过了注销时创建 CSRF 令牌!
因为我已经解决了问题。
只需将以下代码添加到标题中。
<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('/');
为了确保令牌正确创建或不检查浏览器上的“查看页面源”,它将显示如下:
<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">
我认为它可能会解决问题,因为它对我有用!
【讨论】:
【参考方案6】:在表单中添加<?php echo Form::token(); ?>
。
【讨论】:
【参考方案7】:这个解决方案对我有用:
在表单的任意位置添加 csrf_field()
。
【讨论】:
【参考方案8】:从Kernel.php
中的$middleware
中删除App\Http\Middleware\VerifyCsrfToken::class
。
【讨论】:
这应该是一条评论【参考方案9】:我使用了以下代码。它运行良好。
<?php echo csrf_token(); ?>
【讨论】:
【参考方案10】:我遇到了同样的问题。我正在使用 Laravel 5.1.28、php 5.6.13 在VerifyCsrfToken中看到TokenMismatchException后,我在网上搜索了答案,但没有解决我的问题。
页面确实发送了令牌。令牌值也可以在目录 storage/framework/sessions 中的会话文件中看到(我禁用加密才能看到它)。
筋疲力尽,我重新安装 laravel 并使用简单的形式进行测试 - 它没有令牌不匹配错误。
将我的代码一块一块地移动到新安装的laravel中,终于找到了 问题是由教义/dbal引起的(我仍然不知道为什么)。
从 composer.json 中删除它,问题就消失了。 在 composer.json 中,出现了以下行的令牌不匹配错误:
"require":
....
"doctrine/dbal": "^2.5"
...
,
您的情况可能会有所不同,但您可能想看看是否有任何更改 可能导致问题的 composer.json。
【讨论】:
【参考方案11】:添加!! 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">
【讨论】:
【参考方案12】:我在使用这段代码时遇到了同样的问题
<input type="hidden" name="_token" value="!! csrf_token() !!">
<input type="hidden" name="_token" value=" csrf_token() ">
把它改成!! csrf_field() !!
解决我的问题
我在 L5.1
【讨论】:
【参考方案13】:它对我有用。
<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()'])
【讨论】:
以上是关于Laravel 5.1 中的 VerifyCsrfToken.php 第 53 行中的 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章