Созданный пользователь не проходит Django authenticate()
Успешно регистрирую пользователеля, но при попытке входа authenticate всегда выдает None
views.py
class LoginUserView(APIView):
permission_classes = (AllowAny,)
serializer_class = LoginSerializer
renderer_classes = (JSONRenderer,)
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = authenticate(request, **serializer.validated_data)
if user is None:
raise AuthenticationFailed()
token, created = Token.objects.get_or_create(user=user)
response_data = {"token": token.key}
response_serializer = TokenResponseSerializer(response_data)
return Response(response_serializer.data)
serializers.py
class LoginSerializer(serializers.Serializer):
email = serializers.CharField()
password = serializers.CharField()
class TokenResponseSerializer(serializers.Serializer):
token = serializers.CharField()
settings.py
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.TokenAuthentication",
"rest_framework.authentication.SessionAuthentication",
],
"PAGE_SIZE": 10,
}
AUTH_USER_MODEL = "authentication.User"
models.py
class UserManager(DjangoUserManager):
def _create_user(self, email, password, commit=True, **extra_fields):
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
if commit:
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password=None, **extra_fields):
return self._create_user(email, password, role=Role.admin, **extra_fields)
class User(BaseModel, AbstractBaseUser, PermissionsMixin):
objects = UserManager()
email = models.EmailField(unique=True)
role = models.CharField(choices=Role.choices, max_length=15, default=Role.user)\
@property
def is_staff(self):
return self.role in (Role.admin, Role.staff)
@property
def is_superuser(self):
return self.role == Role.admin
EMAIL_FIELD = "email"
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
@property
def token(self):
return self._generate_jwt_token()
def _generate_jwt_token(self):
dt = datetime.now() + timedelta(days=1)
token = jwt.encode({"id": self.pk, "exp": int(dt.strftime("%s"))}, settings.SECRET_KEY, algorithm="HS256")
return token.decode("utf-8")