Je sais qu'il y a des réponses concernant Django Rest Framework, mais je n'ai pas trouvé de solution à mon problème.
J'ai une application qui a une authentification et des fonctionnalités. J'y ai ajouté une nouvelle application, qui utilise Django Rest Framework. Je souhaite utiliser la bibliothèque uniquement dans cette application. Aussi, je veux faire une demande POST, et je reçois toujours cette réponse:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
J'ai le code suivant:
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
url(r'^object/$', views.Object.as_view()),
)
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
class Object(APIView):
@csrf_exempt
def post(self, request, format=None):
return Response({'received data': request.data})
Je veux ajouter l'API sans affecter l'application actuelle. Ma question est donc de savoir comment désactiver CSRF uniquement pour cette application?
django
django-rest-framework
csrf
django-csrf
Irene Texas
la source
la source
Réponses:
Pourquoi cette erreur se produit?
Cela se produit à cause du
SessionAuthentication
schéma par défaut utilisé par DRF. DRFSessionAuthentication
utilise le cadre de session de Django pour l'authentification qui nécessite que CSRF soit vérifié.Lorsque vous n'en définissez aucune
authentication_classes
dans votre vue / ensemble de vues, DRF utilise ces classes d'authentification par défaut.Étant donné que DRF doit prendre en charge à la fois l'authentification basée sur la session et l'authentification non-session pour les mêmes vues, il applique la vérification CSRF uniquement pour les utilisateurs authentifiés. Cela signifie que seules les demandes authentifiées nécessitent des jetons CSRF et que les demandes anonymes peuvent être envoyées sans jetons CSRF.
Si vous utilisez une API de style AJAX avec SessionAuthentication, vous devrez inclure un jeton CSRF valide pour tous les appels de méthode HTTP "non sécurisés", tels que les
PUT, PATCH, POST or DELETE
requêtes.Que faire alors?
Maintenant, pour désactiver la vérification csrf, vous pouvez créer une classe d'authentification personnalisée
CsrfExemptSessionAuthentication
qui s'étend à partir de laSessionAuthentication
classe par défaut . Dans cette classe d'authentification, nous remplacerons leenforce_csrf()
contrôle qui se produisait dans le réelSessionAuthentication
.À votre avis, vous pouvez alors définir le
authentication_classes
comme étant:Cela devrait gérer l'erreur csrf.
la source
Solution plus simple:
Dans views.py, utilisez les accolades CsrfExemptMixin et authentication_classes:
la source
Modifier urls.py
Si vous gérez vos routes dans urls.py, vous pouvez encapsuler vos routes souhaitées avec csrf_exempt () pour les exclure du middleware de vérification CSRF.
Alternativement, en tant que décorateur Certains peuvent trouver l'utilisation du décorateur @csrf_exempt plus adapté à leurs besoins
par exemple,
devrait faire le travail!
la source
Pour tous ceux qui n'ont pas trouvé de réponse utile. Oui DRF supprime automatiquement la protection CSRF si vous n'utilisez pas
SessionAuthentication
AUTHENTICATION CLASS, par exemple, de nombreux développeurs n'utilisent que JWT:Mais le problème
CSRF not set
peut provenir d'une autre raison, par exemple, vous n'avez pas correctement ajouté le chemin à votre vue:au lieu de
la source
J'ai essayé quelques-unes des réponses ci-dessus et j'ai senti que créer une classe séparée était un peu exagéré.
Pour référence, j'ai rencontré ce problème en essayant de mettre à jour une méthode de vue basée sur une fonction vers une méthode de vue basée sur une classe pour l'enregistrement des utilisateurs.
Lorsque vous utilisez des vues basées sur les classes (CBV) et Django Rest Framework (DRF), héritez de la classe ApiView et définissez permission_classes et authentication_classes sur un tuple vide. Trouvez un exemple ci-dessous.
la source
Si vous ne souhaitez pas utiliser l'authentification basée sur la session, vous pouvez supprimer
Session Authentication
de REST_AUTHENTICATION_CLASSES et cela supprimerait automatiquement tous les problèmes basés sur csrf. Mais dans ce cas, les API navigables peuvent ne pas fonctionner.En outre, cette erreur ne devrait pas venir même avec l'authentification de session. Vous devez utiliser une authentification personnalisée telle que TokenAuthentication pour vos API et assurez-vous d'envoyer
Accept:application/json
etContent-Type:application/json
(à condition que vous utilisez json) dans vos demandes avec le jeton d'authentification.la source
Vous devez ajouter ceci pour empêcher l'authentification de session par défaut: (settings.py)
Ensuite: (views.py)
la source
Je suis frappé du même problème. J'ai suivi cette référence et cela a fonctionné. La solution est de créer un middleware
Ajouter le fichier disable.py dans l'une de vos applications (dans mon cas, c'est 'myapp')
Et ajoutez le middileware aux MIDDLEWARE_CLASSES
la source
Si vous utilisez un environnement virtuel exclusif pour votre application, vous pouvez utiliser l'approche suivante sans aucune autre application efficace.
Ce que vous avez observé se produit car
rest_framework/authentication.py
ce code est dans laauthenticate
méthode deSessionAuthentication
classe:Vous pouvez modifier la
Request
classe pour avoir une propriété appeléecsrf_exempt
et l'initialiser dans votre classe View respectiveTrue
si vous ne voulez pas de vérifications CSRF. Par exemple:Ensuite, modifiez le code ci-dessus comme suit:
Il y a des changements connexes que vous devrez faire en
Request
classe. Une implémentation complète est disponible ici (avec une description complète): https://github.com/piaxis/django-rest-framework/commit/1bdb872bac5345202e2f58728d0e7fad70dfd7edla source
Ma solution est montrée coup. Décorez simplement ma classe.
la source
Lors de l'utilisation de POST API REST, l'absence d'en-tête de requête X-CSRFToken peut provoquer cette erreur. Documents Django fournit un exemple de code sur l'obtention et la définition de la valeur du jeton CSRF à partir de JS.
Comme indiqué dans les réponses ci-dessus, la vérification CSRF se produit lorsque la SessionAuthentication est utilisée. Une autre approche consiste à utiliser TokenAuthentication, mais gardez à l'esprit qu'il doit être placé en premier dans la liste des DEFAULT_AUTHENTICATION_CLASSES du paramètre REST_FRAMEWORK.
la source
Cela pourrait également être un problème lors d'une attaque de reliure DNS .
Entre les changements DNS, cela peut également être un facteur. Attendre que le DNS soit complètement vidé résoudra ce problème s'il fonctionnait avant les problèmes / changements DNS.
la source