2016-09-19 3 views
0

J'ai cette erreur:CSRF jeton manquant ou invalide

"CSRF Failed: CSRF token missing or incorrect."

et selon beaucoup de réponses, c'est le moyen de le réparer:

jQuery.ajax({ 
    url: '/api/v1/order/'+orderid+'/', 
    type: 'PUT', 
    data: { 
     csrfmiddlewaretoken: "{{ csrf_token }}" 
    } 
}); 

Cependant, dans mon cas, il n » t. J'ai toujours cette erreur HTTP 403. Je suis sûr que le jeton est envoyé, Firebug me montre csrfmiddlewaretoken=jI8P6LfZ1p1OqIv3ikOU1VPFePjFjFnD dans la demande PUT.

Modifier Lorsque vous utilisez POST comme verbe, cela fonctionne comme prévu.

+0

J'utilise normalement 'serialize() jQuery' afficher mon données à une vue. Je ne sais vraiment pas à coup sûr, mais je me demande si le jeton csrf sérialisé fait une différence. –

+0

Où est ce code? Plutôt que de faire référence à «de nombreuses réponses», vous devriez peut-être consulter la [documentation extrêmement complète] (https://docs.djangoproject.com/fr/1.10/ref/csrf/#ajax) pour gérer CSRF avec Ajax. –

+0

Lorsque vous utilisez 'POST', cela fonctionne. –

Répondre

1

Il est préférable d'obtenir un jeton CSRF à partir des cookies, comme mentionné dans la documentation.

// using jQuery 
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; 
} 
var csrftoken = getCookie('csrftoken'); 

Ensuite, ajoutez à en-tête AJAX:

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

Après ces simples écrire vos requêtes AJAX. L'en-tête CSRF sera ajouté automatiquement.

Dans votre cas:

$.ajax({ 
    url: '/api/v1/order/' + orderid + '/', 
    type: 'PUT', 
    data: {} 
}); 

VOIR, https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

0

Cela devrait fonctionner pour vous:

jQuery.ajax({ 
    url: '/api/v1/order/'+orderid+'/', 
    type: 'PUT', 
    headers: { 
     'X-CSRFToken': "{{ csrf_token }}" 
    }, 
    data: {} 
});