【问题标题】:laravel 5.1 auth csrf token mismatchlaravel 5.1 auth csrf 令牌不匹配
【发布时间】:2015-11-07 08:29:57
【问题描述】:

在做出任何判断之前,我阅读了与我的问题相关的所有相关问题,但没有一个能够解决问题。 所以这是我的问题,当我使用 laravel 5.1 的身份验证工具并想要注册用户时,csrf 令牌生成两次,一次是在我请求显示我的注册表单时,一次是当我将表单数据发布到 auth/register post 路由时,这导致我收到一个 csrf 令牌不匹配异常。这是我的注册表单标记

<form method="POST" action="/auth/register" class="ui large form">
    {!! csrf_field() !!}
  <div class="two fields dirright alignright">      
    <div class="field" >          
      <div class="ui right icon input">
        <i class="user icon"></i>
        {!! Form::text(
          'first_name',
          Input::old('first_name'),
          array(
            'class' => 'dirright alignright fontfamily',
            'placeholder' => 'نام'
          )
        ) !!}
      </div>
    </div>
    <div class="field" >          
      <div class="ui right icon input">
        <i class="user icon"></i>
        {!! Form::text(
          'last_name',
          Input::old('last_name'),
          array(
            'class' => 'dirright alignright fontfamily',
            'placeholder' => 'نام خانوادگی'
          )
        ) !!}
      </div>
    </div>
  </div>
  <div class="field">
    <div class="ui left icon input latintext">
      <i class="mail icon"></i>
      {!! Form::email(
        'email',
        Input::old('email'),
        array(
          'class' => 'latintext',
          'placeholder' => 'E-mail address'
        )
      ) !!}
    </div>
  </div>  
  <div class="field">
    <div class="ui left icon input latintext">
      <i class="lock icon"></i>
      {!! Form::password(
        'password',
        Input::old('password'),
        array(
          'class' => 'latintext',
          'placeholder' => 'Password'
        )
      ) !!}
    </div>
  </div>
  <div class="ui fluid large primary submit button">ثبت نام</div>
  <div class="ui error message alignright"></div>
  </form>

【问题讨论】:

  • 您需要发布更多关于如何提交表单(js sn-p)的信息,html 表单看起来还可以。
  • 我知道这篇文章已经过时了,但它首先出现在我的 Google 搜索中。我遇到了令牌无效的问题,我不知道为什么。对我来说,问题是有 javascript 代码将表单输入设置为禁用。 js 脚本还将 _token 字段标记为禁用,因此它不会与 POST 一起发送。希望这对其他人有用。

标签: php laravel authentication laravel-5 csrf


【解决方案1】:

有几种可能...

1) 如果您在打开的&lt;?php 标记前面有任何空格,则可能会导致此错误(尤其是在您使用 AJAX 时)。因此,请仔细检查以确保您的文件中 &lt;?php 之前没有任何内容。

2) 如果您尝试通过 AJAX 提交此表单数据,文档建议像这样传递 CSRF 令牌:

将此元标记添加到您的&lt;head&gt;:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在 AJAX 调用中执行此操作:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

【讨论】:

  • 不,我不是通过 ajax 提交的,但是关于
【解决方案2】:

只需在表单中添加 csrf 令牌,如下所示:

<input type="hidden" name="_token" value="{{csrf_token()}}"/>

它对我有用。

【讨论】:

    【解决方案3】:

    如果您使用 laravel 5.1,只需添加 {{ csrf_field() }} 即可解决问题

    【讨论】:

      【解决方案4】:

      如果您使用表单的打开和关闭标签,将自动添加 csrf 令牌

      {!! Form::open(['action' => '/auth/register', 'class' => 'ui large form']) !!}
      
      -- Form stuff here --
      
      {!! Form::close() !!}
      

      【讨论】:

        【解决方案5】:

        我希望这会有所帮助

        如下设置元标记

        <meta name="csrf-token" content="{{ csrf_token() }}">
        

        然后请求如下

        $.ajax({
            data: {data1:'data1',data2:'data2'},
            url: '/your/url/goes/here',
            type: 'POST',
            beforeSend: function (request) {
                return request.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-token']").attr('content'));
            },
            success: function(response){
                console.log(response);
            }
        })
        

        【讨论】:

          【解决方案6】:

          假设您的网络服务器已经拥有会话目录的写入权限,在我的例子中是 'app/storage/framework/sessions/'。

          执行:

          $ rm -f {your_web_app}/storage/framework/sessions/*
          

          【讨论】:

            猜你喜欢
            • 2020-07-08
            • 2016-12-10
            • 2016-09-20
            • 2020-01-20
            • 2020-06-17
            • 1970-01-01
            • 2020-05-02
            • 2016-10-15
            • 2020-04-14
            相关资源
            最近更新 更多