Невозможно использовать аутентификацию токена как единственный класс аутентификации в django-rest-knox с пользовательской моделью - PullRequest
0 голосов
/ 03 июня 2019

Я использую django-rest-knox для аутентификации пользователя и knox.auth.TokenAuthentication в качестве единственного класса аутентификации.Кроме того, я использую пользовательские модели, расширяя AbstractBaseUser.В качестве полей для входа у меня есть адрес электронной почты и пароль.

Согласно документации, когда вы используете аутентификацию токена в качестве единственного метода аутентификации, вы должны переопределить встроенный LoginView от knox.Я использовал тот же метод, но, похоже, он не сработал.

views.py

class LoginInterestedUserAPI(LoginView):
    def get_user_serializer_class(self):
        return LoginInterestedUserSerializer

    def post(self, request, format=None):
        serializer = AuthTokenSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        login(request, user)

        return super(LoginInterestedUserAPI, self).post(request, format=None)

serializers.py

class LoginInterestedUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = InterestedUser
        fields = ('email', 'password')

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError("Unable to log in with the provided credentials")

urls.py

...

urlpatterns = [
    path('login', views.LoginInterestedUserAPI.as_view()),
]

Когда я перехожу на URL /api/login, я не получаю поле электронной почты и пароль для ввода своих учетных данных и получаю следующий вывод: -

"detail": "Authentication credentials were not provided."

1 Ответ

0 голосов
/ 04 июня 2019

Первый выпуск был в AuthTokenSerializer в views.py.AuthTokenSerializer использует имя пользователя и пароль для входа в систему, тогда как моя пользовательская модель использовала электронную почту и пароль.Вторая проблема была в LoginInterestedUserSerializer, в которой я использовал ModelSerializer и, таким образом, впоследствии унаследовал метод create, из-за которого я получил ошибку user with this email already exists.Поэтому следует использовать serializers.Serializer.Ниже приведены фрагменты рабочего кода: -

serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = InterestedUser
        fields = ('full_name', 'email')


class LoginInterestedUserSerializer(serializers.Serializer):

    email = serializers.EmailField()
    password = serializers.CharField(max_length=128)

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError("Unable to log in with the provided credentials")

views.py

class LoginView(GenericAPIView):
    serializer_class = LoginInterestedUserSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data
        return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data, 
            "token": AuthToken.objects.create(user)[1]
        })
...