【问题标题】:TokenMismatchException in VerifyCsrfToken.php line 53 in Laravel 5.1Laravel 5.1 中的 VerifyCsrfToken.php 第 53 行中的 TokenMismatchException
【发布时间】: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方法。需要手动设置吗?

标签: php session laravel-5 session-cookies csrf


【解决方案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 代码

&lt;head&gt; 部分中要包含的另一件事是:

<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】:

      在表单中添加&lt;?php echo Form::token(); ?&gt;。

      【讨论】:

        【解决方案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()']) }}
                  

                  【讨论】:

                    猜你喜欢
                    • 2016-06-29
                    • 2016-03-03
                    • 2016-09-02
                    • 2016-03-20
                    • 2015-11-07
                    • 2016-01-02
                    • 2017-07-20
                    • 1970-01-01
                    • 2016-01-04
                    相关资源
                    最近更新 更多