问题描述
我正在尝试创建忘记密码和重置密码页面。
我从 forgotPassword 页面创建了哈希,并将哈希令牌存储在数据库中。
但是当用户点击重置密码链接(这里的哈希令牌在 url 中。)并尝试重置密码时,该过程失败并返回空值。
当我进行手动检查时,我注意到重置密码路由创建的哈希与忘记密码路由不同。
这是代码。
忘记密码
router.post("/forgot-password",async (req,res) => {
const email = req.body.email;
try {
const user = await getUserByEmail(email);
if (!user) {
return res.json({ success: false,message: "Email Couldn't sent." });
}
if (user._id) {
const resetPasswordToken = crypto.randomBytes(20).toString("hex");
const secret = 'abcdefg';
const resetToken = crypto.createHmac('sha256',secret)
.update(resetPasswordToken)
.digest('hex');
console.log(resetToken)
const resetURL = `http://localhost:3000/reset-password/${resetToken}`;
const message = `
<h1>You've requested a new password reset</h1>
<a href=${resetURL} clicktracking=off>${resetURL}</a>
`;
try {
await sendEmail({
to: user.email,subject: "Password Reset Request",text: message,});
try {
const resetStatus = await setupResetPasswordData(email,resetToken)
.catch((error) => {
console.log(error);
});
} catch (error) {
console.log(error);
}
res.status(200).json({ success: true,data: "Email Sent" });
} catch (error) {
user.resetPasswordToken = undefined;
user.resetPasswordExpire = undefined;
await user.save();
return next(error);
}
}
} catch (error) {}
});
这是我的
重置密码
router.put("/reset-password/:resetToken",async(req,res)=>{
const newPassword = req.body.password;
const secret = 'abcdefg';
const resetPasswordToken = crypto.createHmac('sha256',secret)
.update(req.params.resetToken)
.digest('hex');
console.log(resetPasswordToken)
const hashedPass = await hashPassword(newPassword);
const result = await findTokenAndUpdatePasword(resetPasswordToken,hashedPass)
console.log("================================================")
console.log(result)
console.log("================================================")
return res.json(result)
})
问题是,两条路由的哈希值不同。
例如:忘记密码给出:1be2078d76e765ed1fd39ff74a294e0cd549f61c66fbe9c6f023ce23b28dcd28
虽然重置密码给出: 52ab969e76ad6c300de56189a1d6d25cbb61a24db4c47aac0b2ee82f1f84bda5
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)