Django (с использованием TokenAuthentication): «non_field_errors»: «Не удалось войти в систему с предоставленными учетными данными?

Вопрос:Я использую httpie для проверки моей пользовательской аутентификации. http POST username='username1' password='Password123' Я создал собственный объект auth с помощью AbstractUser. Используя функцию TokenAuthentication, я следил за документами и добавлял свою собственную TokenAuthentication в мои настройки REST_FRAMEWORK: REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'regis.models.CustomAuthentication', ) } И добавил rest_framework.authtoken в мои установленные приложения. Мой AUTHENTICATION_BACKEND выглядит

Вопрос:

Я использую httpie для проверки моей пользовательской аутентификации.

http POST username=’username1′ password=’Password123′

Я создал собственный объект auth с помощью AbstractUser.

Используя функцию TokenAuthentication, я следил за документами и добавлял свою собственную TokenAuthentication в мои настройки REST_FRAMEWORK:

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

И добавил rest_framework.authtoken в мои установленные приложения.

Мой AUTHENTICATION_BACKEND выглядит следующим образом:

AUTHENTICATION_BACKENDS = [ ‘regis.models.CustomAuthentication’ ]

И вот мой пользовательский класс проверки подлинности:

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), ]

Я в значительной степени следую за документами DRF (http://www.django-rest-framework.org/api-guide/authentication/#custom-authentication). Если у вас есть дополнительная информация, необходимая для решения этой проблемы, сообщите мне, и я обновлю. Любая помощь в том, что я пропущу, будет отличной.

Чтобы добавить: Просто из любопытства, нужно ли создать пользовательскую систему аутентификации, если у меня есть пользователь?

UPDATE:

Я просто удалил класс выше и просто добавил rest_framework.authentication.TokenAuthentication в мои настройки REST_FRAMEWORK. Я все еще использую пользовательскую проверку подлинности, которая извлекает моего пользователя.

Он выглядит так (не собирается его форматировать). Сосает код форматирования от 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

Я использовал этот Django docs для создания этого кода: https://docs.djangoproject.com/en/1.10/topics/auth/customizing/

Лучший ответ:

ОК, я решил. В моих настройках мне просто пришлось удалить AUTHENTICATIONS_BACKEND. Я думал, что мой пользовательский бэкэнд был другим, для того, чтобы просто регистрировать пользователя, а бэкэнд аутентификации маркера работал, чтобы получить этот токен.

Ответ №1

Если вы ищете строку ошибки в коде DRF, вы найдете это (в 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’) …

Итак, похоже, что в зависимости от используемой версии Django эти учетные данные неверны или пользователь неактивен (для Django >= 1.10)?

Вы пытались войти в систему вручную в админ с этими учетными данными, чтобы проверить их?

Оцените статью
Добавить комментарий