2017-05-04 4 views
0

Hallo ich benutze Django Rest-Auth und ich habe dieses Problem in/Passwort/ändern/es immer zurück csrf Token fehlt oder falsches Problem: Ich mache die Anfrage für einen Android app ich entwickle meine Einstellungen sind:django Rest Framework csrf Token fehlt oder inkorrekt

INSTALLED_APPS = [ 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.sites', 

'rest_framework', 
'rest_framework.authtoken', 

'rest_auth', 
'rest_auth.registration', 

'allauth', 
'allauth.account', 
'allauth.socialaccount', 

]

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

Versionen: django-rest-auth == 0.9.1

djangorestframework == 3.6.2

+1

Erklären Sie, wie Sie die Anforderung, über ein Formular durchführen? Sie müssen das Token in das Formular einfügen. – Todor

+0

@Todor Ich habe die Frage bearbeitet, die Anfrage von Android-App gemacht –

+0

Werfen Sie einen Blick auf diese Frage: http: // Stackoverflow.com/questions/27997483/which-authentication-zu-verwendet-wenn-django-rest-framework-und-ios-app verwenden – Todor

Antwort

0

nach der doc von django Ruhe Rahmen offiziellen Lesen i und eine Menge Hilfe kam aus @Todor comment Ich weiß, dass ich nur TokenAuthentification in den übrigen Authentifizierungsklassen setzen sollte, weil sessionAuthentication einen csrf Wert in der Anforderung erwartet aber android kann‘ t geben Sie das, so dass ich ein Token wie in der doc in jeder Anfrage verwenden, und das ist es!

-1

Nun, die Lösung ist einfach: Sie müssen die CSRF token hinzufügen, wenn Sie Ihre Anfrage stellen. Wie Sie das tun würden, insbesondere können wir nicht antworten, weil wir keine Ahnung haben, wie Sie die Anfrage stellen. d. h. zeigt einen Code.

+0

Die Anfrage wird von Android-App gemacht, die ich mit Formularen oder Vorlage habe ich tun zu tun rief den API-Endpunkt aus der App –

+0

@amirhattab Zeigen Sie, welchen Code Sie verwenden, um den Endpunkt aufzurufen. – smilebomb

+0

Ion.with (this) .load ("POST", "http://127.0.0.1:8000/auth/password/change/") –

0

Speichern und leiten Sie Cookies ordnungsgemäß aus der Android-Netzwerkbibliothek? Ich habe sehr wenig Vertrautheit mit ionischen/Android, aber die Art und Weise, dass Djangos CSRF Kontrollen arbeiten, ist dies:

  • Überprüfen Sie, ob ein CSRF-Token im Körper als csrfmiddlewaretoken
  • ist gegeben, wenn kein solcher Parameter vorhanden ist, prüfen ein Cookie namens csrftoken
  • , wenn kein solches Cookie vorhanden ist, an den HTTP_X_CSRFTOKEN Header
  • zurückgreifen kann

der Cookie-Name und Header-Namen in den Einstellungen angepasst werden.

Also was ich bekomme ist, welche Methode verwenden Sie oben, um das CSRF-Token zu senden? Auf mobilen Geräten ist es normalerweise schwierig, ein CSRF-Token für die Anfrage zu erhalten, da der Client das Formular generiert (wobei Django im Web das Formular generiert und das CSRF-Token eingibt).

Das heißt, es ist auch üblich, Endpunkte CSRF freizustellen, und es scheint, als ob Sie eine Drittanbieter-Bibliothek für diese Endpunkte verwenden, also bin ich mir nicht sicher, warum es ein CSRF-Token benötigt. Sie können die Dokumentation des Projekts überprüfen.

Die andere Möglichkeit besteht darin, dass Sie Ihre eigene Ansicht an diese URL gebunden haben und diese Ansicht statt der aus der von Ihnen verwendeten Bibliothek erreichen. Es ist schwer zu sagen. Warum versuchen Sie nicht zuerst die Anfrage mit DRF Browsable API?

0
REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
) 
} 

entfernen 'rest_framework.authentication.SessionAuthentication' von DEFAULT_AUTHENTICATION_CLASSES, wenn Sie noch durchsuchbar api Ansicht für DRF benötigen, ModHeader in Chrom verwenden.

Verwandte Themen