Вопрос:
Я использую 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)?
Вы пытались войти в систему вручную в админ с этими учетными данными, чтобы проверить их?