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()']) }}