簡體   English   中英

通過 email 重置密碼

[英]Resetting password via email

很抱歉,我正在嘗試通過 email 重置密碼,直到現在我設法將重置鏈接發送到 email,現在我在后端嘗試了這個:

userRouter.get('/reset', expressAsyncHandler(async (req, res) => {
  const user = await User.findOne({
    where: {
      resetPasswordToken: req.query.resetPasswordToken,
      resetPasswordExpires: {
        $gt: Date.now(),
      },
    },
  });
  if (user) {
    console.log('token matched')
    res.status(200).send({
      message: 'password reset link ok'
    })
  } else {
    console.log('password reset link is invalid or has expired');
    res.json('password reset link is invalid or has expired');
  }
})
);

在忘記密碼中,我做了這樣的事情來更新兩個字段:

user.update({
        resetPasswordToken: token,
        resetPasswordExpires: Date.now() + 360000,
      });

我的用戶 Model 是:

    name: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    password: { type: String, required: true },
    isAdmin: { type: Boolean, default: false, required: true }

當我嘗試使用 where 子句檢查 resetPasswordToken 是否返回我的所有用戶時,這是錯誤的。 我在想我需要在 model 中聲明 resetPasswordToken 和 resetPasswordExpires 以實現這兩項工作? 還是足夠了? 另一個問題是,我必須將什么發送到前端才能正常工作?

在 react-redux 中,我有以下 function,但我是 100%,我發送了錯誤的數據:

export const checktoken = (email) => async (dispatch) => {
  dispatch({ type: USER_RESET_PASSWORD_REQUEST, payload: { email } });
  try {
    const { data } = await Axios.get('/api/users/reset');
    dispatch({ type: USER_RESET_PASSWORD_SUCCESS, payload: data });;
    localStorage.setItem('userInfo', JSON.stringify(data));
  } catch (error) {
    dispatch({
      type: USER_RESET_PASSWORD_FAIL,
      payload:
        error.response && error.response.data.message
          ? error.response.data.message
          : error.message,
    });
  }
};

首先,您的 model 沒有字段resetPasswordTokenresetPasswordExpires 這意味着您的update將不起作用。 我假設您使用的是 mongoose,並且 mongoose 不會更新 model 中不存在的字段。

添加條目如下。

name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
isAdmin: { type: Boolean, default: false, required: true },
resetPasswordToken: { type: String },
resetPasswordExpires: { type: Number }

其次,您的查詢是錯誤的。 查詢應該像...

  const user = await User.findOne({
      resetPasswordToken: req.query.resetPasswordToken,
      resetPasswordExpires: {
        $gt: Date.now(), 
      },
  });

注意:始終檢查您的數據庫以查看您的update條目是否確實已更新。

前端

在驗證用戶 + 令牌存在后,您可以將res.status(200).send()發送到您的 web 應用程序。

然后,在您的 web 應用程序中,您將要求用戶輸入新密碼。 用戶輸入新密碼后,您將(再次)將新密碼令牌發送到后端。

這次,您需要再次驗證令牌,然后才能將密碼更新為用戶 model。 這將確保重置密碼來自有效來源。

一旦密碼更新,您可能希望從文檔中刪除 resetPasswordToken 和 resetPasswordExpires,因為它不再需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM