angular js-controller wird das cookie vom login-request-header, auch nachdem ich eine Erhalten Sie nach der Anmeldung
Derzeit durch die Verwendung der setTimeout-Methode bin ich in der Lage, erfolgreich zu tun, was ich will. Dies ist aber nicht der ideale Ansatz.
Wenn wir senden Sie eine login-Anfrage, man will das CSRF-token aus dem Antwort-header und verwenden Sie es insubsequent http-Aufrufe. Die http.get () - Anforderung bedeutet, dass für uns(es legt die login-Antwort-header in den request-header). Danach wollen wir eine post-Anforderung wieder, basierend auf der Antwort, die wir erhalten, aus der http.get () - Anforderung innerhalb der login callback.
Hier das problem, dass der code immer ausgeführt, bevor der browser beendet, Einstellung der CSRF-token empfangen von response in den request-header. Um dieses problem zu überwinden, ich habe eine setTimeout-Funktion. Aber ich weiß nicht wirklich, wie das Konzept der Zugabe eines hardcoded delay.
Gibt es eine effiziente Möglichkeit, dies zu tun?
app.controller('loginCtrl', function ($scope, $http, $location, $cookies, $q, Cart,$rootScope)
{
var defer = $q.defer();
$scope.submit = function(){
$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;application/JSON";
//login
$http.post('http://127.0.0.1:8000/api/user/login/', JSON.stringify({'email': $scope.email, 'password': $scope.password})
).success(function(data){
defer.promise.then(function(){
//need to get a cart to check if a cart is created
Cart.getCart(function(data){
defer.promise.then(function(){
//if cart not created create one
if(data.length == 0){
setTimeout(function(){
$http.defaults.headers.common["X-CSRFToken"] = $cookies.csrftoken;
Cart.addCart(function(data){
alert('cart successfully created \n ' + JSON.stringify(data));
$rootScope.cartId = data[0].pk
$rootScope.cart = data[0].fields;
$location.path('/products');
}, function(error){
alert('addcart failed');
});
},300);
} else {
$rootScope.cartId = data[0].pk;
$rootScope.cart = data[0].fields;
$location.path('/products');
}
})
}, function(error){
alert('getcart failed');
});
})
//need code to get the cookies, still dont know how
}).error(function(data){
alert('failure');
});
defer.resolve();
};
});
Ich kann versuchen zu erklären, das problem, das ich an diesem Projekt zu arbeiten. Wir senden eine POST-Anforderung an unseren Django-Anwendung anmelden. Nach der Anmeldung senden wir eine ERHALTEN die Benutzer in den Einkaufswagen legen, und wenn es keinen Warenkorb für den Benutzer haben wir eine neue erstellen(Sie können sehen, dass im obigen code überprüfen wir die Daten.Länge == 0). Wenn es keine Wagen wir POSTEN Sie eine Anfrage zu erstellen Warenkorb. In Django müssen wir X-CSRFToken auf POST-Anfrage. Wenn wir nicht rufen addCart fuction Aufruf innerhalb der setTimeout-Funktion,die X-CSRF-Angriffe auf die POST-Anforderung ist nicht das gleiche wie der Satz auf der login-Antwort und gibt 401err
Ah stimmt, der code ist ein wenig verwirrend. Vermutlich
defer
eingeführt wurde, in einem Versuch, um die Sache zu arbeiten. So weit wie ich kann sagen, es ist nicht notwendig und kann gefahrlos entfernt werden. Was übrig bleibt sieht aus wie es sollte funktionieren, aber es scheint, dass es irgendeine Art von Rennen Wirkung in Einstellung $http.defaults.headers.common["X-CSRFToken"]
. Sehr seltsam, da die Angabe einer Standard-header sollte zuverlässig synchron.InformationsquelleAutor Karan Khanna | 2013-12-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht könnten Sie abfangen der Antwort Parsen der Header und setzen Sie das token manuell.
Etwas wie dieses:
BEARBEITEN NEUER ANSATZ
Vielleicht so etwas?
Hmm, interessant, macht aber Sinn, weil die interceptor hängt von http http, aber noch nicht an der Zeit, von der interceper Schöpfung.
auf der Grundlage der neuen Lösung ist, kann ich nicht aufrufen den Warenkorb gelegt.getCart () - api, sobald der Benutzer fertig ist die Anmeldung. Ich sehe das Netzwerk, das login gelungen ist, mit status 200.
Die neue Ausgabe der Vorgehensweise, die Sie vorgeschlagen, gearbeitet. Vielen Dank!!! 🙂
Ziemlich alte Frage, aber es scheint, dass diese Lösungen nicht funktionieren, d.h. auch wenn die Spionage in den Kopf-ich kann finden Sie unter "Set-Cookie",
headers("Set-Cookie");
null ist.InformationsquelleAutor kfis
Funktioniert es, wenn Sie es weltweit?
InformationsquelleAutor kfis