django-rest-framework Rückkehr 403 Antwort auf POST, PUT, DELETE trotz AllowAny Berechtigungen
Ich bin mit einem django-oneall sozialen login-session-Authentifizierung auf meiner Website. Während es nicht eine der vorgeschlagenen auth-Anbieter für django-rest-framework, rest_framework.authentication.SessionAuthentication
verwendet django ' s default-session-Authentifizierung. also dachte ich, es sollte Recht einfach zu integrieren.
Auf die Berechtigungen Seite, schließlich verwende ich IsAdmin
, aber zum Zweck der Entwicklung, ich hatte es eingestellt, um IsAuthenticated
. Wenn Sie, dass die Rückgabe 403s, entspannte ich die Berechtigungen AllowAny
, aber noch keine Würfel. Hier ist mein rest-framework config:
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
# 'rest_framework.permissions.IsAuthenticated',
# 'rest_framework.permissions.IsAdminUser',
),
'PAGE_SIZE': 100,
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.DjangoFilterBackend',
),
}
EDIT:
Habe ich diese arbeiten auf der Grundlage der Antwort unten. Es stellt sich heraus, dass rest_framework
erwartet, dass beide die csrftoken
cookie und ein X-CSRFToken
Header den gleichen Wert haben, richte ich meine front-end-code schicken header für alle ajax-Anfragen und alles hat gut funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Django REST Framework zurückgegebene status-code
403
unter ein paar relevante Umstände:DEFAULT_PERMISSION_CLASSES
ist('rest_framework.permissions.IsAuthenticated',)
.rest_framework.authentication.SessionAuthentication
und Sie haben nicht enthalten Ihr CSRFToken in der requeset.Werde ich ein paar demo-Anfragen gegen eine test-API zu geben, wird jeweils ein Beispiel, um Ihnen zu helfen bei der diagnose, welche Problem Sie haben und zeigen, wie es zu lösen. Ich werde mit der
requests
Bibliothek.Die test-API
Ich eine sehr einfache DRF-API mit einem einzigen Modell
Life
, enthält ein einzelnes Feld (answer
mit einem Standard-Wert von42
). Alles, was von hier aus ist ziemlich geradlinig; ich habe einModelSerializer
-LifeSerializer
eineModelViewSet
-LifeViewSet
, und einDefaultRouter
auf die/life
URL-route. Ich habe konfiguriert DRF zu benötigen Benutzer authentifiziert werden, die API zu nutzen und zu verwendenSessionAuthentication
.Schlagen die API
HTTP_X_CSRFTOKEN
header?X-CSRFToken
und das cookiecsrftoken
gesetzt werden musste.$.ajaxSetup()
oder etwas ähnlichesIsAuthenticated
privs. Sobald ich ein update für meine social-login - /Registrierungsseite, so dass es unterscheiden kann zwischen admin und normalen user, ich werde in der Lage sein zu wechselnIsAdmin
!Vollständigkeit halber, es gibt noch einen Umstand, unter dem DRF gibt code 403: wenn Sie vergessen, hinzuzufügen
as_view()
zu der Ansicht, die Erklärung in Ihre urls.py Datei. Nur mir passiert ist, und ich verbrachte Stunden damit, bis ich herausfand, wo das Problem war, also vielleicht mit diesem Zusatz können sparen Sie einige Zeit für jemanden.as_view
ist für django class based views, hat es zu den besten meines Wissens nichts tun, tun Sie mit api-urls von django-rest-framework. DRF auch nicht, erwähnen Sie es in Ihrer routing-Dokumentation (außer für die Einbeziehung von nicht-DRF-Ansichten), django-rest-framework.org/api-guide/routers . Könnten Sie näher erläutern was Sie bedeuten?Nur für alle, die vielleicht das gleiche problem.
Wenn Sie mit viewsets ohne Router wie:
Django Rest framework zurück 403, es sei denn, Sie definieren permission_classes auf einem Klasse Niveau:
Hoffe, es hilft!