python - 在 mongoengine 中更新密码后,bcrypt(python)中的盐无效
问题描述
在使用 mongoengine 存储在 mongoDb 之前,我使用 bcrypt 对密码进行哈希处理。存储初始用户后,登录也可以正常工作。
我添加了一个更新密码的选项,在尝试使用更新的密码登录后,我收到以下与密码匹配的错误-
ValueError: Invalid salt
我在下面附加了 Document 类:
class Donator(Document):
meta = {'collection': 'Donator'}
user_name = StringField(required=True, unique=True)
password = StringField(required=True)
date_last_update = DateTimeField(default=datetime.utcnow)
这就是我做 POST、PUT 和登录的方式
salt = bcrypt.gensalt(8)
def add_donator_from_request(request):
donor_old = get_donator_from_username(request.form['user_name'])
if donor_old is not None:
return "Donor already exist with username : " + str(request.form['user_name']), 401
hashed = bcrypt.hashpw(request.form['password'].encode("utf-8"), salt)
donor = Donator(password=hashed,
user_name=request.form['user_name'])
donor.save()
return donor.to_json(), 201
def login(request):
donor = get_donator_from_username(request.form['user_name'])
if donor is None:
return "Donor does not exist with username: " + str(request.form['user_name']), 404
else:
password_utf8 = request.form['password'].encode("utf-8")
if bcrypt.checkpw(password_utf8, donor.password.encode("utf-8")):
return donor.to_json(), 200
else:
return "Wrong password for given username: " + str(request.form['user_name']), 401
def update_password_from_request(request):
donor = get_donator_from_username(request.form["user_name"])
if donor is None:
return "Donor does not exist with username: " + str(request.form['donator_id']), 404
else:
hashed = bcrypt.hashpw(request.form['password'].encode("utf-8"), salt)
donor.update(password=str(hashed),
date_last_update=datetime.utcnow)
donor.reload()
return donor.to_json(), 201
如果我在更新时没有将 str() 放在散列密码上,我会收到以下错误
mongoengine.errors.ValidationError: StringField only accepts string values
但是,在最初制作对象时,同一行代码可以正常工作,没有任何问题。
我无法理解我哪里出错了。谢谢
解决方案
推荐阅读
- android - MoPub 原生广告和 Facebook 的“未找到广告”
- javascript - 如何在 Java 中使用 Selenium WebDriver 访问 Canvas 元素内的元素?
- windows - terraform 构建 ec2 窗口
- python - 安排Asyncio任务每X秒执行一次?
- python - Apache Beam python Bigquery将流式插入更改为批量插入?
- batch-file - 如何将当前目录的最后两个文件夹存储在 .bat 文件的变量中
- scala - 理解我的 Scala 代码中的协方差
- arrays - 用于查找多个共享上的文件年龄的 Powershell 脚本
- javascript - array.forEach() 如何处理异步函数?
- android - Google Nearby Connections 对连接距离设置了限制,例如“附近消息”