[PYTHON] Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django

Aperçu

La publication avec HttpProvider d'AngularJS sur un point de terminaison créé avec la vue standard de Django ou le cadre Django REST renvoie une erreur 403. Allons.

$http.post('/api/entries', {'title': 'journal intime', 'body': 'Il fait beau aujourd'hui'})

Response

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

Cause

C'est parce que je n'ai pas réussi à contourner correctement la protection CSRF de Django, indépendamment de l'utilisation d'AngularJS.

Il semble que la valeur de l'en-tête de demande qui stocke le jeton CSRF est différente entre la valeur utilisée par AngularJS par défaut et la valeur reconnue par Django.

Si vous lisez le document suivant, Django doit envoyer la valeur de csrftoken avec le nom d'en-tête X-CSRFToken lors d'une requête Ajax.

Cross Site Request Forgery protection | Django documentation | Django

Solution

Le HTTPProvider d'AngularJS a une option pour changer le comportement de la protection CSRF, et si vous le spécifiez, vous pouvez changer le nom de l'en-tête lors de l'envoi d'un jeton CSRF et la clé du cookie à référencer.

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

Pour configurer Django, définissez comme suit.

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

Désormais, AngularJS interprétera et enverra automatiquement le jeton csrf sans que vous ayez à faire quoi que ce soit. Toutes nos félicitations.

De côté

Il y a une autre dépendance à l'utilisation d'AngularJS avec Django, et il n'est pas possible de faire une expansion variable par défaut car l'expansion variable d'AngularJS est en conflit avec le moteur de template de Django.

Vous pouvez être heureux si vous changez le symbole en vous référant à ce qui suit.

Comment résoudre un conflit de portée variable entre AngularJS et jinja2 --Qiita

Recommended Posts

Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
[Django] Comment résoudre les erreurs lors de l'installation de mysqlclient
Gestion des fichiers statiques lors du déploiement en production avec Django
Comment ne pas charger d'images lors de l'utilisation de PhantomJS avec Selenium
Comment démarrer avec Django
[Astuces] Comment étendre le modèle lors de la création de HTML avec django
Comment effectuer un traitement arithmétique avec le modèle Django
Comment gérer les erreurs en frappant pip ②
Comment développer une application de panier avec Django
Comment implémenter "named_scope" de RubyOnRails avec Django
Comment accéder avec cache lors de la lecture_json avec pandas
Lorsque vous souhaitez filtrer avec le framework Django REST
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
Comment analyser avec Google Colaboratory à l'aide de l'API Kaggle
Choses à faire lorsque vous commencez à développer avec Django
Points à garder à l'esprit lors de la migration avec Django
Comment écrire plus rapidement en utilisant numpy comme deque
Model.objects.extra à prendre en compte avant d'utiliser du SQL brut avec Django
Comment traiter l'erreur "Erreur de type: Aucune signature correspondante trouvée" lors de l'utilisation de pandas fillna
Lors de l'utilisation d'optparse avec iPython
Éliminez les erreurs qui se produisent lors de l'utilisation de Django REST Swagger avec Django 3.0
Comment réinitialiser le mot de passe via l'API à l'aide du framework Rest Django
Comment vérifier le comportement d'ORM avec un fichier avec django
Comment mettre à jour les informations utilisateur sur Django RemoteUserMiddleware login
Comment mettre à jour avec SQLAlchemy?
[Django] Comment donner des valeurs d'entrée à l'avance avec ModelForm
Paramètres de DEBUG lors de l'utilisation de Django
Comment lancer avec Theano
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment modifier avec SQLAlchemy?
Comment séparer les chaînes avec ','
Précautions lors de l'utilisation de Python avec AtCoder
Comment gérer l'entrée du terminal dans l'environnement pipenv sans autorisation lors de l'utilisation de pipenv avec vscode
Comment faire RDP sur Fedora31
Choses à garder à l'esprit lors de l'utilisation de cgi avec python.
Comment mettre à jour le blog FC2, etc. en utilisant XMLRPC avec Python
Comment gérer UnicodeDecodeError lors de l'exécution du téléchargement d'image Google
Comment supprimer avec SQLAlchemy?
Comment générer des informations supplémentaires lors de la sortie de journaux avec le module de journalisation de python
Comment ne pas échapper au japonais en traitant avec JSON en Python
Comment gérer "Vous avez plusieurs backends d'authentification configurés ..." (Django)
Comment afficher des formules en latex lors de l'utilisation de Sympy (> = 1.4) dans Google Colaboratory
Comment gérer les erreurs lors de l'installation de whitenoise et du déploiement sur Heroku
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Comment passer des arguments en utilisant une instance avec la commande systemctl de systemd
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
Impossible de se lier à une erreur d'interface lors de l'utilisation d'Apollo Federation avec gqlgen
Lorsque vous souhaitez envoyer un objet avec des requêtes à l'aide de flask
Comment installer Python à l'aide d'Anaconda
Comment annuler RT avec Tweepy
Étapes pour développer Django avec VSCode
Python: comment utiliser async avec
[Django] Comment tester le formulaire [TDD]
Comment installer python-pip avec ubuntu20.04LTS
Standardiser le HTML à louer avec Django
Comment gérer les données déséquilibrées