Django и использование bcrypt для хэширования и проверки паролей для входа в систему
Я использую bcrypt в другом API и он работает для меня там, я скопировал код в мое приложение django и получаю ошибку:
TypeError: Strings must be encoded before checking
Какой тип поля должен быть установлен для поля пароля в моей модели базы данных? В настоящее время это models.CharField
password = models.CharField(max_length=200, default=None)
Для установки пароля в базе данных я делаю:
passW = self.context['request'].data["password"]
encodedPass = passW.encode('utf8')
instance.userprofile.password = bcrypt.hashpw(encodedPass, bcrypt.gensalt(rounds=14))
instance.userprofile.save()
Для проверки пароля, когда они вводят его во фронтенде, я делаю:
passW = self.context['request'].data["password"]
encodedPass = passW.encode('utf8')
print(f"raw password {passW}")
print(f"encoded pass {encodedPass}")
print(f"stored pass {instance.userprofile.password}")
# Checks if the supplied passcode matches the user's login passcode
if bcrypt.checkpw(encodedPass, instance.userprofile.password):
return instance
encodedPass возвращает b'omitted' а сохраненный пасс возвращает b'omitted'
Проблема заключается в использовании models.CharField() для хэшированного поля пароля в вашей базе данных.
Вы должны использовать models.BinaryField()