Crypto Hmac 在 Node.js 中创建不同的哈希

问题描述

我正在尝试创建忘记密码和重置密码页面

我从 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 (将#修改为@)