csurf AJAX调用 – 无效的CSRF令牌

我使用快速中间件csurf进行CSRF保护。 如果我将它与表单一起使用,将令牌放入隐藏字段中,路由后面的操作就起作用。 现在我想做一个简单的AJAX调用,但是csurf说它是无效的。

AJAX调用:

$('.remove').on('click', function () { var csrf = $(this).attr('data-csrf'); $.ajax({ type: 'DELETE', url: '/user/' + $(this).attr('data-id'), data: { _csrf: csrf }, success: function (data) { //..... } }); }); 

而在视图中的部分:

 <td class="uk-table-middle"> <button data-id="{{ _id }}" data-csrf="{{ csrfToken }}" class="uk-button-link uk-text-large remove"> <i class="uk-icon-remove"></i> </button> </td> 

而从中间件的init:

 import * as csurf from 'csurf'; // init bodyparse and and and... app.use(csurf()); 

我不明白,但通常CSRF令牌是在一个cookie里面,所以你需要这两个函数:

  function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } 

接着:

 var csrftoken = getCookie('csrftoken'); $.ajax({    url : formURL,    type: "POST",    data : postData, beforeSend: function(xhr, settings){ if (!csrfSafeMethod(settings.type)) xhr.setRequestHeader("X-CSRFToken", csrftoken); },    success:function(data, textStatus, jqXHR){    },    error: function(jqXHR, textStatus, errorThrown){        //if fails    } }); 

或者,如果您不想使用jQuery,则可以使用XMLHttpRequest来发出AJAX请求:

 var csrftoken = getCookie('csrftoken'); var xhr = new XMLHttpRequest(); xhr.open('POST', url); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.setRequestHeader("X-CSRFToken", csrftoken); xhr.onload = function(){ if(xhr.status === 200){ var response = JSON.parse(xhr.responseText); console.log(response) } }; xhr.send(encodeURI('category=' + cat));