XSRF-Header nicht gesetzt AngularJS
Entwickle ich ein DJANGO + AngularJS-Anwendung, wobei die eckigen Teil nicht bedient werden, die von django.
Ich die eckige $httpProvider
wie folgt:
myApp = angular.module('myApp', [])
myApp.config(['$httpProvider',
function(provider){
provider.defaults.xsrfCookieName = 'csrftoken';
provider.defaults.xsrfHeaderName = 'X-CSRFToken';
}
Dann, bevor Sie jegliche POST muss ich eine BEKOMMEN, die setzt den cookie. Kann ich bestätigen, durch Chrom, der das cookie gesetzt ist:
set-cookie:csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO; expires=Tue, 19-Aug-2014 12:26:35 GMT; Max-Age=31449600; Path=/
(es ist sichtbar in Mittel/cookies/localhost in die Chrome developer tools)
Jedoch wenn ich einen BEITRAG, keine X-CSRFToken
header gesetzt wird
dies ist der POST aufgenommen von Chrome:
POST /data/activities/search HTTP/1.1
Host: localhost:14080
Connection: keep-alive
Content-Length: 2
Accept: application/json, text/plain, */*
Origin: http://localhost:14080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:14080/public/html/main.html?codekitCB=398694184.799418
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO
Warum wird kein header gesetzt wird? Was sollte ich sonst tun, um aktivieren Sie diese Funktionalität?
(Randbemerkung: wenn ich manuell übergeben Sie den Kopf in den $http () - Aufruf, der die POST-Anforderung funktioniert gut.. also das problem ist wirklich die header nicht setzen AngularJS)
- Ich war mit 1.0.8, aber ich fand heraus, es ist nur von Version 1.2.0
Du musst angemeldet sein, um einen Kommentar abzugeben.
sehr einfache Antwort: es ist nur von version 1.2.0, die momentan einen release candidate.
Die 1.2.0 update war nicht ausreichend für mich, bei der Verwendung von Safari oder Firefox (Chrome konnte gut funktioniert die ganze Zeit). Das problem mit Safari und Firefox war, dass die Django-backend nicht senden Sie die csrf-cookie in der HTTP-Antwort.
Was ich tun musste, war, fügen Sie das @ensure_csrf_cookie Dekorator meiner Sicht-Funktion, baut sich die Seite für Angularjs.
und in der javascript-Datei:
Zumindest für jetzt habe ich keine Ahnung, warum Chrome funktioniert auch ohne es, aber die anderen Browser nicht.
Ich hatte ein ähnliches Problem und es war peinlich meine Schuld.
Mein Fehler:
Stellen Sie sicher, dass Sie mit der
$http
Objekt!War es sehr einfach, diese Fehler machen, da beide zu funktionieren scheinen, ebenso gut wie jeder andere, außer ersteres nicht anschauen
$http.defaults.headers.common['X-CSRFToken']
usw.getCookie() nehmen von https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
Oder legen Sie jede Methode separat
Winkel ändert sich sehr Häufig und einige Antworten funktionieren nicht mit aktuellen Versionen. In irgendeiner Weise, da Eckige erwartet eine
XSRF-TOKEN
cookie-Namen, und sendet eineX-XSRF-TOKEN
header, können wir alternativ auch einfach sagen, Django, diese zu verwenden, standardmäßig:Die erste Einstellung (siehe docs) ist der cookie-name für das csrf-token, während die zweite (siehe docs, erst in 1.9) ist der jeweilige header-Namen.
Letzten, nur als Referenz, vergessen Sie nicht: