2017-02-24 3 views
1

Ich httpie mit meiner benutzerdefinierten Authentifizierung testenDjango (mit TokenAuthentication): „non_field_errors“: „Kann nicht mit angegebenen Anmeldeinformationen anmelden

http POST http://127.0.0.1:8000/api-token-auth/ username='username1' password='Password123' 

Ich habe eine benutzerdefinierte Auth-Objekt erstellen AbstractUser verwenden..

mit TokenAuthentication folgte ich die Dokumentation und fügte hinzu, meine benutzerdefinierte TokenAuthentication in meinen REST_FRAMEWORK Einstellungen:

REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'regis.models.CustomAuthentication', 
    ) 
} 

Und hinzugefügt rest_framework.authtoken in meinen installierten Apps.

Mein AUTHENTICATION_BACKEND sich wie folgt:

AUTHENTICATION_BACKENDS = [ 'regis.models.CustomAuthentication' ] 

Und hier ist meine benutzerdefinierte Authentifizierungsklasse:

class CustomAuthentication(authentication.TokenAuthentication): 
    def authenticate(self, request): 
     username = request.META.get('X_USERNAME') 
     print(username) 
     user_model = get_user_model() 
     if not username: 
      return None 
    try: 
     user = user_model.objects.get(username=username) 
    except User.DoesNotExist: 
     raise exceptions.AuthenticationFailed('No such user') 
    return (user, None) 

urls.py:

urlpatterns += [ 
    url(r'^api-token-auth/', views.obtain_auth_token), 

    ] 

Ich bin so ziemlich das folgende DRF-Dokumente (http://www.django-rest-framework.org/api-guide/authentication/#custom-authentication). Wenn weitere Informationen benötigt werden, um das Problem zu lösen, lass es mich wissen und ich werde es aktualisieren. Jede Hilfe bei dem, was mir fehlt, wäre großartig.

Hinzufügen: Nur aus Neugier, muss ich ein benutzerdefiniertes Authentifizierungssystem erstellen, wenn ich einen benutzerdefinierten Benutzer habe?

UPDATE:

Ich löschte nur die Klasse oben, und habe soeben die rest_framework.authentication.TokenAuthentication in meinen REST_FRAMEWORK Einstellungen. Ich verwende immer noch eine benutzerdefinierte Authentifizierung, die meinen Benutzer abruft.

Es sieht wie folgt aus (werde es nicht formatiert saugt SO bei Formatierungscode von VIM.):

class CustomAuthentication(object): 
def authenticate(self, email=None, password=None): 

    User = get_user_model() 
    try: 
     user = User.objects.get(email=email) 
    except User.DoesNotExist: 
     return None 
    if user.check_password(password): 
     return user 

    return None 

def get_user(self, user_id): 
    try: 
     user_model = get_user_model() 
     user = user_model.objects.get(pk=user_id) 
    except User.DoesNotExist: 
     return None 

ich diese Django docs verwendet diesen Code zu erstellen: https://docs.djangoproject.com/en/1.10/topics/auth/customizing/

+0

Nur um Ihre Neugier zu beantworten: Nein, Sie benötigen keine benutzerdefinierte Authentifizierung, wenn Sie einen benutzerdefinierten Benutzer verwenden. Der Build, den ich bei der Arbeit verwende, hat einen benutzerdefinierten Benutzer und verwendet das Standard-ModelBackend, das mit Django ausgeliefert wird. :) – Neelik

+0

@Neelik ayyyee hook mich mit einem Job dort! –

+0

Vielleicht, wenn das Unternehmen ein bisschen wächst: P Wir sind immer noch eine kleine lokale Gruppe. – Neelik

Antwort

0

OK, ich habe es gelöst. Innerhalb meiner Einstellungen musste ich nur die AUTHENTICATIONS_BACKEND entfernen. Ich dachte, dass mein benutzerdefiniertes Backend anders war, als nur einen Benutzer einzuloggen und das Token-Authentifizierungs-Backend arbeitete, um dieses Token zu erhalten.

1

Wenn Sie suchen die Fehlerzeichenfolge im Code DRF Du findest (in authtoken/serializers.py:

from django.contrib.auth import authenticate 
... 

if username and password:                                                    
    user = authenticate(username=username, password=password)                                           

    if user:                                                       
     # From Django 1.10 onwards the `authenticate` call simply                                          
     # returns `None` for is_active=False users.                                              
     # (Assuming the default `ModelBackend` authentication backend.)                                         
     if not user.is_active:                                                   
      msg = _('User account is disabled.')                                              
      raise serializers.ValidationError(msg, code='authorization') 
    else:                                                      
     msg = _('Unable to log in with provided credentials.')                                           
     raise serializers.ValidationError(msg, code='authorization') 
... 

So wie es aussieht, je nachdem, welche Version von Django Sie verwenden, entweder diese Anmeldeinformationen sind falsch oder der Benutzer ist nicht aktiv (für Django> = 1.10)?

Haben Sie versucht, sich im Admin mit diesen Zugangsdaten manuell anzumelden, um sie zu überprüfen?

+0

Ich mache iOS-Entwicklung und benutze die E-Mail und das Passwort, um sich einzuloggen, was in Ordnung ist. Ich ging zur Shell und fragte nach dem Benutzernamen des Benutzers und es ist korrekt. Ich habe gerade überprüft, ob der Benutzer aktiv ist, und es zeigt "wahr". Sieht alles in meiner Frage richtig aus, oder fehle ich gerade etwas, das mir nicht bekannt ist? –

+0

BTW, ja, ich benutze Django 1.10.2 –

+0

Was ist, wenn der Benutzer bereits authentifiziert ist? –

Verwandte Themen