Я использую 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."