Сохраните поле в виде хэша и сравните его в django

Я создал свою собственную модель пользователя:

class CustomUser(AbstractBaseUser,PermissionsMixin):
    phone_number = models.CharField(verbose_name="Mobile Number", max_length=11, unique=True, blank=False, null=False)
    security_code = models.IntegerField(verbose_name="Security Code",default=create_security_code)
    security_code_creation = models.DateTimeField(auto_now=True)

Пользователь может войти в систему с помощью пароля или кода безопасности.

Я хочу, чтобы это было так:

Если пользователь хочет войти в систему с помощью кода безопасности, я создаю случайный код безопасности в своем представлении, отправляю ему сообщение и сохраняю хэшированную версию кода безопасности в своей базе данных. Пользователь вводит номер из полученного сообщения, и я сравниваю хэшированную версию того, что ввел пользователь, с тем, что у меня есть в базе данных. примерно как пароль.

Но я не хочу хранить код безопасности в виде обычного текста в своей базе данных. Я хочу хранить его как пароль (хэшированный).

Я нашел

from django.contrib.auth.hashers import make_password

который я могу использовать для создания хэшированной версии кода безопасности.

Мой вопрос в том, должен ли я написать отдельный бэкенд аутентификации или просто написать/использовать функцию типа check_password, которая имплантирована в AbstractBaseUser?

Переопределение check_password в вашем пользовательском классе может работать примерно так.

При входе в систему вы указываете пароль или код, и метод сначала проверяет, соответствует ли значение паролю, а если нет, то проверяет, соответствует ли значение коду безопасности

from django.contrib.auth.hashers import check_password, make_password

class CustomUser(AbstractBaseUser, PermissionsMixin):
    ...
    security_code = models.CharField(verbose_name="Security Code",max_length=128)
    ...
    def set_security_code(self, code):
        self.security_code = make_password(code)
        self.security_code_creation = now()

    def check_password(self, raw_password):
        password_matched = super().check_password(raw_password)
        if not password_matched and self.security_code_creation > now() - timedelta(days=1):
            return check_password(raw_password, self.security_code)
        return False
Вернуться на верх