Backend/Node.js

Node.js - Nodemailer + Gmail 사용하여 비밀번호 찾기 구현

yxemsy 2022. 3. 7. 22:47
Nodemailer 에서 Gmail을 사용하기 위해서는 앱 비밀번호 설정이 필요하다.
구글 계정설정 → 보안 → 앱 비밀번호 추가

* 생성된 앱 비밀번호는 다시 확인할 수 없으므로 기록이 필수다.

 

구글 계정 메뉴에서 자물쇠 모양 보안을 들어간다.

 

이 곳에서 2단계 인증을 하면 앱 비밀번호를 추가할 수 있다. 

 

 

- nodemailer 코드

const nodemailer = require('nodemailer')

const transport = nodemailer
    createTransport({
      service: 'Gmail',
      auth: {
          user: "google account", # 본인 구글 계정
          pass: "app password", # 본인 앱 비밀번호
      },
     })
     ...
     
const message = {
    from: "login account",
    to: "mail address",
    subject: "title",
    text: "message",
   }
   
transport.sendMail(message, (err, info) => {
    if(err) {
    	console.error('err', err)
        return
    }
    
    console.log('ok', info)
  })

 

- 랜덤 비밀번호를 만들어서 비밀번호를 메일로 발송하기

# 임의의 문자열을 만들어주는 함수
function generateRandomPassword() {
    return Math.floor(
    	Math.random() * (10** 8)
    ).toString().padStart('0', 8)
   }
   
---

router.post('/reset-password', asyncHandler(... => {
    const { email } = req.body
    const randomPassword = generateRandomPassword()
    await User.findOneAndUpdate({ email }, {
    	password: getHash(password),
     })
     
    await sendEmail(email, '...', password)
    res.redirect('/')
    }))

email을 받아서 생성된 임의의 문자열로 사용자의 비밀번호를 초기화한 후,

초기화한 비밀번호를 메일로 발송하는 코드이다.

 

 

- 초기화 후 로그인 시 비밀번호 변경 요청

 

비밀번호 변경

const UserSchema = ...
    passwordReset: {
    	type: Boolean,
        default: false,
    }
 ...
 
 ---
 
 router.post('/reset-password', ...
 	await User.findOneandUpdate({
    ...
        passwordReset: True,
    })

 

비밀번호 변경 요청

function checkPasswordReset(req, res, next) {
    if(req.user && req.user.passwordReset) {
    	res.redirect('/update-password')
        return
     }
     
     next()
    }
    
 ---
 
 router.post('/udpate-passwodr', ...
 	await User.findOneAndUpdate({
    ...
        passwordReset: false,
       })