[PYTHON] So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django

Überblick

Das Posten mit AngularJSs "HttpProvider" auf einem Endpunkt, der mit Djangos Standardansicht oder Django REST Framework erstellt wurde, gibt einen 403-Fehler zurück. Komm schon.

$http.post('/api/entries', {'title': 'Tagebuch', 'body': 'Es ist heute ein gutes Wetter'})

Response

{detail: "CSRF Failed: CSRF token missing or incorrect."}

Ursache

Dies liegt daran, dass ich den CSRF-Schutz von Django ungeachtet der Verwendung von AngularJS nicht gut umgehen konnte.

Es scheint, dass sich der Wert des Anforderungsheaders, in dem das CSRF-Token gespeichert ist, zwischen dem von AngularJS standardmäßig verwendeten Wert und dem von Django erkannten Wert unterscheidet.

Wenn Sie das folgende Dokument lesen, muss Django bei einer Ajax-Anfrage den Wert "csrftoken" mit dem Headernamen "X-CSRFToken" senden.

Cross Site Request Forgery protection | Django documentation | Django

Lösung

AngularJSs "HTTPProvider" bietet eine Option zum Ändern des Verhaltens von CSRF Protection. Wenn Sie dies angeben, können Sie den Headernamen beim Senden eines CSRF-Tokens und den Schlüssel des Cookies ändern, auf das verwiesen werden soll.

[AngularJS: API: http](https://docs.angularjs.org/api/ng/service/http#cross-site-request-forgery-xsrf-protection)

Um Django einzurichten, gehen Sie wie folgt vor.

var myApp = angular.module('myApp', []).config(function($httpProvider) {
	$httpProvider.defaults.xsrfCookieName = 'csrftoken'
	$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'
});

Jetzt interpretiert AngularJS das csrf-Token automatisch und sendet es, ohne dass Sie etwas tun müssen. Herzliche Glückwünsche.

Beiseite

Es gibt noch eine weitere Sucht nach AngularJS mit Django, und es ist standardmäßig nicht möglich, Variablen zu erweitern, da die Variablenerweiterung von AngularJS mit der Vorlagen-Engine von Django in Konflikt steht.

Sie können sich freuen, wenn Sie das Symbol wie folgt ändern.

So lösen Sie einen Konflikt mit variablem Bereich zwischen AngularJS und jinja2 --Qiita

Recommended Posts

So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
[Django] So beheben Sie Fehler bei der Installation von mysqlclient
Umgang mit statischen Dateien bei der Bereitstellung in der Produktion mit Django
So laden Sie keine Bilder, wenn Sie PhantomJS mit Selen verwenden
Wie fange ich mit Django an?
[Tipps] Die Vorgehensweise beim Erstellen von HTML mit Django wird erweitert
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch
Umgang mit Fehlern beim Auftreffen auf pip pip
So entwickeln Sie eine Cart-App mit Django
So implementieren Sie "named_scope" von RubyOnRails mit Django
Zugriff mit dem Cache beim Lesen von_json mit Pandas
Wenn Sie mit dem Django REST-Framework filtern möchten
Beenden bei Verwendung von Python in Terminal (Mac)
Analysieren mit Google Colaboratory mithilfe der Kaggle-API
Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Dinge, die Sie bei der Migration mit Django beachten sollten
Wie man schneller schreibt, wenn man numpy wie deque verwendet
Model.objects.extra muss berücksichtigt werden, bevor Raw SQL mit Django verwendet wird
Umgang mit dem Fehler "Typfehler: Keine übereinstimmende Signatur gefunden" bei Verwendung von pandas fillna
Bei Verwendung von optparse mit iPython
Beseitigen Sie Fehler, die bei der Verwendung von Django REST Swagger mit Django 3.0 auftreten
Zurücksetzen des Passworts über die API mit dem Django Rest Framework
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
So aktualisieren Sie Benutzerinformationen bei der Django RemoteUserMiddleware-Anmeldung
Wie aktualisiere ich mit SQLAlchemy?
[Django] Wie man Eingabewerte im Voraus mit ModelForm angibt
DEBUG-Einstellungen bei Verwendung von Django
Wie man mit Theano besetzt
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Wie mit SQLAlchemy ändern?
So trennen Sie Zeichenfolgen mit ','
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Umgang mit dem Terminal, das ohne Erlaubnis in die pipenv-Umgebung gelangt, wenn pipenv mit vscode verwendet wird
Wie man RDP auf Fedora31 macht
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
So aktualisieren Sie FC2-Blogs usw. mithilfe von XMLRPC mit Python
Umgang mit UnicodeDecodeError beim Ausführen des Downloads von Google-Bildern
Wie lösche ich mit SQLAlchemy?
So geben Sie zusätzliche Informationen aus, wenn Sie Protokolle mit dem Protokollierungsmodul von Python ausgeben
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
Umgang mit "Sie haben mehrere Authentifizierungs-Backends konfiguriert ..." (Django)
So zeigen Sie Formeln in Latex an, wenn Sie sympy (> = 1.4) in Google Colaboratory verwenden
Umgang mit Fehlern bei der Installation von Whitenoise und der Bereitstellung auf Heroku
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Übergeben von Argumenten mithilfe einer Instanz mit dem systemctl-Befehl von systemd
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
Bei Verwendung des Apollo-Verbunds mit gqlgen kann keine Bindung an einen Schnittstellenfehler hergestellt werden
Wenn Sie ein Objekt mit Anforderungen mithilfe der Flasche senden möchten
So installieren Sie Python mit Anaconda
So brechen Sie RT mit tweepy ab
Schritte zur Entwicklung von Django mit VSCode
Python: So verwenden Sie Async mit
[Django] So testen Sie Form [TDD]
So installieren Sie Python-Pip mit Ubuntu20.04LTS
Standardisieren Sie HTML, um mit Django gemietet zu werden
Umgang mit unausgeglichenen Daten