Was ist der richtige Weg, um angular2 http-Anfragen mit Django CSRF-Schutz?
In Angular1 das problem kann gelöst werden, indem die Konfiguration der $http-Anbieter. Wie:
app.config(function($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
});
Was ist eine gute Praxis, das gleiche zu tun in Angular2?
In Angular2 für die Arbeit mit http-Anfragen, die wir verwenden müssen, um die Klasse Http. Natürlich ist dies nicht eine gute Praxis, fügen Sie CSRF-line mit jedem Aufruf der post-Funktion.
Ich denke, in Angular2 sollte ich erstellen Sie eine eigene Klasse, die erbt Angular2 die Http-Klasse neu zu definieren und die post-Funktion. Ist es der richtige Ansatz oder gibt es eine elegantere Methode?
- ja, wir können ein weltweites service-und Sie können alles schreiben was Sie wollen der ganzen app. dann vorsehen, dass global service in der bootstrap Datei.ich denke, das gibt Euch einen Hinweis
- Nun, die version 2.0 wurde offiziell veröffentlicht, die die früheren Antworten scheinen nicht mehr funktioniert. Bitte siehe meine Antwort weiter unten, wie Sie zu verwenden CookieXSRFStrategy.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Victor K s Antwort ist vollkommen gültig, aber als der Winkel-2.0.0-rc.2, ein bevorzugter Ansatz wäre, die Nutzung CookieXSRFStrategy als unten,
{provide:XSRFStrategy, useValue: new CookieXSRFStrategy('csrftoken', 'X-CSRFToken')}
Nun, der Winkel 2 ist freigegeben, die folgenden scheint auf die richtige Art dies zu tun, indem
CookieXSRFStrategy
.Ich so konfiguriert haben, dass mein Antrag auf eine core-Modul aber Sie können das gleiche tun, in Ihrem Haupt-Anwendung-Modul statt:
ERROR in Error encountered resolving symbol values statically. Calling function 'CookieXSRFStrategy', function calls are not supported. Consider replacing t he function or lambda with a reference to an exported function
. Aber wenn man speichern, die das cli Gebäude wieder aber jetzt ohne einen Fehler.new CookieXSRFStrategy('csrftoken', 'X-CSRFToken')
mit einer Funktion, die zurückgibt, die Linie. Das sollte es lösen.Lösung für Angular2 ist nicht so einfach wie für angular1.
Sie brauchen:
Herausgreifen
csrftoken
cookie-Wert.Addieren Sie diesen Wert zur request-Header mit dem Namen
X-CSRFToken
.Biete ich dieses snippet:
Späteren Versionen von angular Sie können keine Funktionen aufrufen, die in Dekorateuren. Die Verwendung einer factory Anbieter:
Verwenden und dann die Fabrik:
Sonst der compiler wird Ihnen sagen, off.
Was ich auch schon gesehen habe ist, dass ng bauen-Uhr nicht melden Sie diese Fehler, bis man ihn wieder aus.
Victor K hatte die Lösung, ich werde nur hinzufügen, dass dieser Kommentar hier, was ich getan habe:
Habe ich die Komponente "ExRequestOptions", wie Victor K sagte, aber ich habe auch eine Methode "appendHeaders", um die Komponente:
Dann hatte ich das in meiner main.ts:
Ich bin nicht sicher, ob das bootstrapping hatte keine Wirkung, so habe ich das auch gemacht, wo
Ich würde post-Daten:
Ich kämpfte mit diesem für ein paar Tage. Die Ratschläge in diesem Artikel ist gut, aber als der August, 2017 ist veraltet (https://github.com/angular/angular/pull/18906). Die angular2 empfohlene Ansatz ist einfach, hat aber einen Nachteil.
Den empfehlen Ansatz ist die Verwendung von HttpClientXsrfModule und zu konfigurieren, es zu erkennen, django Standard-csrf-Schutz. Nach dem django docs, django, wird das cookie senden
csrftoken
und erwarten, dass der Kunde zur Rücksendung der headerX-CSRFToken
. In angular2, fügen Sie Folgendes zu Ihrerapp.module.ts
Die Einschränkung ist, dass angular2 ist XSRF-Schutz gilt nur für mutierend Anforderungen:
Wenn Sie brauchen, um Unterstützung für eine API, führt Mutationen auf den GET/HEAD, müssen Sie erstellen Sie Ihre eigenen benutzerdefinierten interceptor. Sie finden ein Beispiel und eine Diskussion der Frage hier.
Derzeit, ich lösen, nichts mit custom-Header mit einem wrapper-service rund um den Http-Service. Sie können hinzufügen, was header manuell und injizieren zusätzliche Dienste zum speichern/abrufen von Werten. Diese Strategie funktioniert auch für JWTs, zum Beispiel. Haben einen Blick auf den code unten, ich hoffe es hilft.