80 votes

"Jeton CSRF manquant ou incorrect" lors de la publication du paramètre via AJAX dans Django

J'essaie de poster un paramètre comme

  jQuery.ajax(
        {
            'type': 'POST',
            'url': url,
            'contentType': 'application/json',
            'data': "{content:'xxx'}",
            'dataType': 'json',
            'success': rateReviewResult 
        }
    );

Cependant, Django renvoie Forbidden 403. CSRF verification failed. Request aborted. J'utilise 'django.middleware.csrf.CsrfViewMiddleware' et je n'ai pas trouvé comment éviter ce problème sans compromettre la sécurité.

56voto

jerrykan Points 376

Le moyen le plus simple que j'ai trouvé est d'inclure la valeur {{csrf_token}} dans les données :

 jQuery.ajax(
    {
        'type': 'POST',
        'url': url,
        'contentType': 'application/json',
        'data': {
            'content': 'xxx',
            'csrfmiddlewaretoken': '{{ csrf_token }}',
        },
        'dataType': 'json',
        'success': rateReviewResult 
    }
);

17voto

Khaino Points 1210

Simple et court

 $.ajaxSetup({
  headers: { "X-CSRFToken": '{{csrf_token}}' }
});

OU

 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", '{{csrf_token}}');
    }
  }
});

documents

9voto

CpILL Points 167

Faute de réponse directe, il suffit d'ajouter l'en-tête X-CSRFToken à la requête ajax qui se trouve dans le cookie csrftoken . JQuery ne fait pas de cookies (pour une raison quelconque) sans plugin donc :

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>

et le changement de code minimal est :

 $.ajax({
  headers: { "X-CSRFToken": $.cookie("csrftoken") },
  ...
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X