Échec CSRF: jeton CSRF manquant ou incorrect
J'utilise Django 1.7 et django-rest-framework.
j'ai créé une API qui me renvoie quelques données JSON en mettant ceci dans mon settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
'DEFAULT_RENDERER_CLASSES': (
# 'rest_framework.renderers.XMLRenderer',
'rest_framework.renderers.JSONRenderer',
# 'rest_framework.renderers.BrowsableAPIRenderer',
)
}
Quand je fais REÇOIS des appels, il me renvoie toutes les données, mais lorsque j'essaie de la METTRE/PATCH j'obtiens:
--------Response Headers---------
Status Code: 403
Date: Wed, 29 Oct 2014 18:51:42 GMT
Vary: Cookie
Server: WSGIServer/0.1 Python/2.7.8
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
---------------------------------
--------Response Body-----------
{"detail": "CSRF Failed: CSRF token missing or incorrect."}
---------------------------------
cela ne se produit que lorsque je suis connecté, si je suis anonyme je peux mettre / PATCH correctement.
j'ai essayé avec @csrf_exempt
et j'ai eu des erreurs, j'ai inclus l' rest_framework.permissions.AllowAny
dans le paramètre...
Je n'ai aucune idée de ce qui se passe. Personne ne sait ce qu'est la question?
5 réponses
Lorsque vous utilisez SessionAuthentication, vous utilisez L'authentification de Django qui nécessite habituellement une vérification CSRF. Django REST Framework applique ceci, seulement pour SessionAuthentication
, vous devez donc passer le jeton CSRF dans le X-CSRFToken
en-tête.
documentation de Django fournit plus d'informations sur la récupération du jeton CSRF en utilisant jQuery et l'envoi de requêtes. Le jeton CSRF est enregistré sous la forme d'un cookie appelé csrftoken
que vous pouvez récupérer à partir d'un Réponse HTTP, qui varie selon le langage utilisé.
si vous ne pouvez pas récupérer le cookie CSRF, c'est habituellement un signe que vous ne devriez pas utiliser SessionAuthentication
. Je vous recommande de regarder dans TokenAuthentication ou OAuth 2.0 selon vos besoins.
j'ai eu le même problème, j'ai enveloppé mes URLs sous csrf_exempt
méthode -
from django.views.decorators.csrf import csrf_exempt
url(r'^api/v1/some-resource$', csrf_exempt(SomeApiView.as_view())),
C'est ce que j'ai fait pour le résoudre, j'ai inclus le jeton csrf dans le formulaire et en utilisant jQuery/ javascrip j'ai obtenu le jeton csrf comme ceci lorsque le document est chargé
var $crf_token = $('[name="csrfmiddlewaretoken"]').attr('value');
l'a inclus sur les en-têtes jquery comme suit
$.ajax({
type: "POST",
url: "/api/endpoint/",
data: newEndpoint,
headers:{"X-CSRFToken": $crf_token},
success: function (newEnd) {
console.log(newEnd);
add_end(newEnd);
},
error: function () {
alert("There was an error")
}
});
Obtenir le jeton de cookie:
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
var csrftoken = readCookie('csrftoken');
envoyer jeton dans headers POST request:
this.$http.post(server,{params: {foo: 'bar'}}, {headers: {"X-CSRFToken":csrftoken }}).then(function (response) {
this.response = response.data;
},
function (response) {
console.log(response);
});
j'ai eu un problème similaire où j'avais enveloppé les vues avec csrf_exempt
et se heurtait encore à des erreurs. Il s'est avéré que j'obtenais L'URL erronée, il a été résolu à un "not found" callback (qui n'était pas exempté de CSRF) et a donc été jeter une exception avant que je puisse être dit que L'URL était erronée.