即使字符串完全相同,Bcrypt比较和compareSync也总是返回false?我用console.log来验证它们是相同的,并且它们没有被散列两次等等。这是一个奇怪的问题。我已经在其他类似的问题上尝试过解决方案。
model.js
import mongoose from "mongoose";
import bcrypt from "bcryptjs";
const ResetTokenSchema = new mongoose.Schema({
owner: {
type: mongoose.Schema.Types.ObjectId,
ref: "Doctor",
required: true,
},
token: {
type: String,
required: true,
},
createdAt: {
type: Date,
expires: 3600, //expires after an hour
default: Date.now(),
},
});
// HASH token before storing
ResetTokenSchema.pre("save", async function (next) {
if (this.isModified("token")) {
const encryptedToken = await bcrypt.hash(this.token, 8);
this.token = encryptedToken;
console.log("the token is" + this.token)
}
next();
});
ResetTokenSchema.methods.compareToken = async function (encryptedToken) {
const result = await bcrypt.compare(encryptedToken, this.token);
console.log(this.token)
console.log(encryptedToken)
console.log(result)
return result;
};
export default mongoose.model("ResetToken", ResetTokenSchema);
控制台输出:
1条答案
按热度按时间jaxagkaj1#
问题:
下面是来自bycryptjs源代码的
.compare()
函数的作用:下面是该函数的正确用法示例
代码所做的是将字符串与其自身进行比较,而不是将字符串与其哈希值进行比较。
.compare(a,b)
与a===b
* 不 * 相同。可能的解决方案:
在您的代码中,可以使用
.pre()
函数中的以下代码行将原始令牌重新分配给新的哈希令牌:如果删除此行,代码将正常工作。
或者,如果你真的想重新分配,那么你必须改变你正在做的事情,并将原始令牌存储在其他地方,如果你想在以后与它进行比较的话。