Невозможно войти как суперпользователь в DRF

Создал суперпользователя несколько раз с этими учетными данными.
имя пользователя: admin
пароль: root
Делал это с помощью терминала и с помощью Djnago ORM. Тот же результат.

>>> from bank.models import User
>>> User.objects.create_superuser(username="admin", password="root")
>>> from django.contrib.auth import authenticate
>>> u = authenticate(username="admin", password="root")
>>> u
>>> type(u)
<class 'NoneType'>

>>> admin = User.objects.get(username="admin")
>>> admin
<User: admin>
>>> admin.is_active
True
>>> admin.is_staff
True
>>> admin.is_superuser
True

Это началось с тех пор, как я начал использовать токены python-jwt, но сбой происходит до того, как код переходит к части токена.
Та же функция входа в систему как обычный пользователь работает, как и должна, и выдает рабочий токен.

@api_view(['POST'])
def login_view(request):
    username = request.data.get("username")
    password = request.data.get("password")
    user = User.objects.filter(username=username).first()

    if user is None:
        raise exceptions.AuthenticationFailed("Invalid Credentials")
    if not user.check_password(password):
        # code fails here after trying lo log in as superuser
        raise exceptions.AuthenticationFailed("Invalid Credentials")

    token = services.create_token(user_id=user.id)
    resp = response.Response()
    resp.set_cookie(key="jwt", value=token, httponly=True)
    resp.data = {"token": token}
    return resp

Это происходит из-за UserManager. По умолчанию Django UserManager хэширует пароль при создании суперпользователя. Когда вы пытаетесь создать обычного пользователя, по умолчанию его пароль не хэшируется. В моем случае я хэшировал пароль, переписав метод save() в модели User.

    def save(self, *args, **kwargs):
        self.set_password(self.password)
        super().save(*args, **kwargs)

И это прекрасно работает для обычного пользователя, но пароль суперпользователя хэшируется сам по себе, поэтому из-за этого метода он хэшируется дважды. Поэтому проверка пароля выглядит примерно так \

hash(input_password) == hash(hash(original_password))

Поэтому я не смог войти в систему как суперпользователь.

Вернуться на верх