使用表单数据添加 laravel CSRF 令牌

Adding laravel CSRF token with form data

通过所见即所得编辑器上传图像时,我需要使用 FormData() 传递 Laravel CSRF 令牌。但它似乎失败了,或者它没有使用 append() 方法添加 csrf 令牌。

这是我的代码:

  function uploadImage( image ) {
    var data = new FormData();
    data.append( "image", image );

    data.append( "csrfToken", Laravel.csrfToken ); // <- adding csrf token
    // Laravel.csrfToken will return the csrf token.

    console.log( data.entries() );
    $.ajax ({
      data: data,
      type: "POST",
      url: "/article/store/image",
      cache: false,
      contentType: false,
      processData: false,
      success: function(url) {
        var image = IMAGE_PATH + url;
          $( '#editor' ).summernote( "insertImage", image );
        },
        error: function( data ) {
          console.log( data );
        }
    });
  }

它没有在表单数据中添加 laravel csrf 令牌,因为我仍然收到错误

TokenMismatchException in VerifyCsrfToken.php line 68

如何在表单数据中添加token?

您应该添加一个名为 - _token 的字段,而不是像这样的 csrfToken

data.append( "_token", Laravel.csrfToken ); // <- adding csrf token

这就是 Laravel 的辅助方法 - csrf_field() 所做的。

根据 Laravel Docs,在调用 Ajax 的情况下 - 例如,您可以将令牌存储在 HTML 元标记中::

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

然后像这样在您的 ajax header 中包含:

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

希望对您有所帮助!

对于ajax个请求,我喜欢用$.ajaxSetup.

设置一次

在我的布局中:

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

在我的 app.js:

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

这让我不必记住将 _token 输入附加到每个请求。

虽然@Saumya 已经回答了这个问题,但我使用 headers 发送 CSRF 令牌,如下所示:

$.ajax ({
  data: data,
  type: "POST",
  headers: {'X-CSRF-TOKEN': Laravel.csrfToken },
  url: "/article/store/image",
  cache: false,
  contentType: false,
  processData: false,
  success: function(url) {
    var image = IMAGE_PATH + url;
      $( '#editor' ).summernote( "insertImage", image );
    },
    error: function( data ) {
      console.log( data );
    }
});  

如果您使用 ajax 在整个应用程序中发送多个请求,您可以一次为每个请求进行全局设置:

$.ajaxSetup({
headers: {
    'X-CSRF-TOKEN': Laravel.csrfToken
}
});

了解更多Here