2016-03-09 10 views
7

Ich versuche Vue.js zu verwenden, um einige POST-Methoden zu meiner REST API, die ich mit Django Rest Framework erstellt habe, zu machen. Problem ist, ich bekomme den CSRF Failed: CSRF token missing or incorrect. Fehler, wenn ich poste. Aber ich kann den csrf-Cookie sehen und er wird zu den Headern hinzugefügt. meine EinstellungenDjango Rest Framework, CSRF und Vue.js

Hier:

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
     'rest_framework.permissions.DjangoModelPermissions' 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.BasicAuthentication' 
    ) 
} 

Hier ist meine Vue.js config:

var csrftoken = Cookies.get('csrftoken'); 
Vue.http.headers.common['HTTP_X_CSRFTOKEN'] = csrftoken; 

Und hier ist der relevante Teil der Header, die gesendet wurden:

Cookie:djdt=hide; tabstyle=raw-tab; sessionid=1gl533mrneudxw3l9l2vg0ja1yowwmeo; csrftoken=dN85bhztB1oVRov87BsUrWTM29Ff9sjn 
Host:127.0.0.1:8000 
HTTP_X_CSRFTOKEN:dN85bhztB1oVRov87BsUrWTM29Ff9sjn 
Origin:http://127.0.0.1:8000 
Referer:http://127.0.0.1:8000/agencies/6/add-profiles/ 

Wie Sie Sie können sehen, Cookie.csrf und der Header HTTP_X_CSRFTOKEN entsprechen

Ich bin wirklich ratlos. Irgendwelche Vorschläge?

+1

Welche 'CSRF_HEADER_NAME' Einstellung verwenden Sie? Ich weiß, dass 'HTTP_X_CSRFTOKEN' 'X-CSRFTOKEN' sein sollte, wenn du es sendest, weil django es konventionell in seinen Eingeweiden formatiert: https://docs.djangoproject.com/de/1.9/ref/settings/#csrf-header- Name – Nevertheless

+1

Haben Sie Ihre Apps in der gleichen Domain? oder benutzt du CORS? –

+0

Yerko Palma hat Recht, es könnte auch ein Problem mit derselben Anfrage-Richtlinie oder "CSRF_COOKIE_HTTPONLY" -Einstellung sein. – Nevertheless

Antwort

8

Also poste ich dies als eine Antwort, um die Frage zu schließen.

Das Problem war wegen des falschen CSRF-Header-Namens, der auf Anfrage gesendet wurde. Laut Dokumentation:

Wie bei anderen HTTP-Header in request.META erhielt der Header-Name vom Server durch die Umwandlung aller Zeichen Groß normalisiert wird, ersetzt alle Bindestriche mit Unterstrichen und das Hinzufügen eines ‚HTTP_ 'Präfix zum Namen. Wenn Ihr Client beispielsweise eine 'X-XSRF-TOKEN'-Kopfzeile sendet, sollte die Einstellung' HTTP_X_XSRF_TOKEN 'lauten.

Auch hier einen Verweis auf my question, ich verlasse die mehrere Probleme sammelt, die in Django zu CSRF Failed: CSRF token missing or incorrect. Fehler führen kann.

Verwandte Themen