iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
Security

從自建漏洞中學習 - 一起填坑吧系列 第 25

Auth 應用程式 - Reset passord 篇之 1

  • 分享至 

  • xImage
  •  

Auth 應用程式 - Reset passord 篇之 1

在 user 真正重設密碼前,後端大致上會經過以下過程:

  1. 根據 email 取得 user
  2. 產出隨機的 reset token
  3. 將 token 以 email 方式寄出

建立 forgotPassword function

一開始,我們需要在 AuthController 中建立一個 forgotPassword 的 function:
在這之中,我們需要:

  1. 取得 user
  2. 隨機生成 reset token 並儲存
  3. 將 token 以 email 方式寄出

forgotPassword function:

exports.forgotPassword = catchAsync(async(req, res, next) => {
   // 1. 根據 post 的 email 取得 user
   const user = await User.findOne({ email: req.body.email });
   if (!user) {
       return next(new AppError('There is no user with this email address.', 404));
   }
   
   // 2. 隨機生成 reset token
   const resetToken = user.createTokenForResetPassword();
   // 儲存加密後的 resetToken & 停掉驗證器
   await user.save({ validateBeforeSave: false });
   
   // 3. 寄送 email
   // 此處會在下次進行講解
});

在 userModel 中建立 createPasswordResetToken function,並實作加密:

userSchema.methods.createTokenForResetPassword = function () {
    const resetToken = crypto.randomBytes(32).toString('hex');
    
    this.tokenForResetPassword = crypto.createHash('sha256').update(resetToken).digest('hex');
    
    // 為了安全性,我們需要設定這個 passwordReset 什麼時候會過期: 10 mins
    this.passwordResetExpiresIn = Date.now() + 10 * 60 * 1000;
    
    return resetToken;
}

在 userModel 更新 userSchema:

const userSchema = new mongoose.Schema({
// 略
    tokenForResetPassword: String,
    passwordResetExpiresIn: Date
});

今日小心得

最近身體狀況有點不太好,但還是先今天的一些學習打了出來,希望之後能慢慢進步。


Reference


上一篇
Auth 應用程式 - Authentication 認證篇 2 - 加入 Error 處理
下一篇
Auth 應用程式 - Reset passord 篇之 2
系列文
從自建漏洞中學習 - 一起填坑吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言