当我尝试登录时显示令牌错误。我已经在视图中检查了令牌,并在评论\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!!!!!']);
}
}
答案 0 :(得分:5)
编辑:
由于您正在使用表单构建器,请从表单中删除它。执行Form::open()
删除此行:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
答案 1 :(得分:2)
嗯,我认为所有人都在注销时错过了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">
我认为这可能会解决问题,因为它对我有用!
答案 2 :(得分:1)
使用全新安装的Laravel 5.1,不仅仅是从5.0到5.1的作曲家更新,我看到了一些差异,而且在Middleware文件夹中有一个差异。
EncryptCookies.php是一个新的中间件,检查你是否拥有它。
所以,我没有再次测试过,我现在将我的文件从我的5.0版转换到5.1版的新安装但我很确定可以解决这个问题,EncryptCookies.php是在令牌不匹配错误的堆栈中。
答案 3 :(得分:1)
添加{!! csrf_field() !!}
解决了我的问题,如下所示:
<form action="#" method="post" class="form-horizontal" role="form">
{!! csrf_field() !!}
</form>
如果使用Laravel Form帮助程序,如下所示:
{!! Form::open(array('class' => 'form-horizontal', 'role' => 'form')) !!}
CSRF代码将自动添加到您的html脚本中。另外,请确保在浏览器中查看源代码,以确保确实添加了下面的字段。
<input type="hidden" name="_token" value="dHWBudjTyha9AMr0SuV2ABq5NNK6bTIDZDXRWCBA">
答案 4 :(得分:0)
您没有在问题中发布示例代码。
因此,请使用以下选项检查您的代码,
尝试隐藏输入字段值:
{!! csrf_token() !!} or {{ csrf_token() }}
您还可以使用表单刀片模板:
{!! Form::open(array('method' => 'GET/POST','url' => 'YOUR_URL',)) !!}
这将自动在您的html脚本中添加CSRF代码
在<head>
部分中要包含的另一件事是:
<meta name="csrf-token" content="{{ csrf_token() }}">
答案 5 :(得分:0)
尝试上传文件时我也遇到了这个问题。结果是超出了max_post_size,在这种情况下显然所有POST变量都被清除,因此没有收到任何令牌。
答案 6 :(得分:0)
在表单旁边添加<?php echo Form::token(); ?>
。
答案 7 :(得分:0)
这个解决方案对我有用:
在表单的任何位置添加{{ csrf_field() }}
。
答案 8 :(得分:0)
从Kernel.php中的$ middleware中删除App \ Http \ Middleware \ VerifyCsrfToken :: class。
答案 9 :(得分:0)
我使用了以下代码。它工作得很好。
<?php echo csrf_token(); ?>
答案 10 :(得分:0)
我遇到了同样的问题。我正在使用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 :(得分:0)
使用此代码时遇到同样的问题
<input type="hidden" name="_token" value="{!! csrf_token() !!}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
将其更改为{!! csrf_field() !!}
解决我的问题
我在L5.1
答案 12 :(得分:0)
它对我有用。
<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()']) }}