Сохраните поле в виде хэша и сравните его в 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