É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?

29
demandé sur Kevin Brown 2014-10-29 22:40:02

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.

46
répondu Kevin Brown 2014-10-29 20:58:48

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())),
2
répondu Suyash Soni 2018-02-20 07:03:13

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")
            }
        });
1
répondu adoniswalker 2018-05-05 15:31:43

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);
        });
0
répondu Ruslan 2018-07-07 21:40:12

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.

0
répondu kokociel 2018-07-08 05:14:30