글 작성자: 망고좋아
반응형

🎯 회원 비밀번호 찾기 구현

📝 로직

  1. 임의의 문자열로 비밀번호 초기화
  2. 초기화된 문자열을 메일로 전달 → 메일 발송 기능 개발 필요
  3. 초기화 후 첫 로그인 시 비밀번호 변경 요청

 

📝 메일 발송 기능 구현 방법

📕 SMTP 서버 이용

  • Simple Mail Transfer Protocol
  • 메일 전송을 위한 표준 규약
  • SMTP 서버란 표준 규약을 통해 메일을 전송하는 기능을 구현한 서버
  • 네이버 구글 등의 메일서버를 이용하여 무료로 발송 가능
  • 메일 발송 및 관리 기능 직접 개발 필요

 

📕 메일 발송 서비스 이용 (Mailgun, Sendgrid ... )

  • 메일 발송 api 제공 및 관리용 웹페이지 제공
  • 사용량에 따라 유료 과금

 

📝 Node.js 에서 메일 발송하기

  • SMTP 서버를 직접 만들고 운영하는 것은 비효율적이다.
  • Nodemailer 패키지를 사용하여 SMTP 서버를 통해 메일을 발송할 수 있다.
  • 메일 기능을 제공하는 서비스 제공자들은 SMTP 서버를 사용할 수 있게 제공한다. ex) Gmail, Naver

 

📝 Nodemailer + Gmail 사용하기

  • Nodemailer에서 Gmail을 사용하기 위해서는 앱 비밀번호 설정이 필요
  • 구글 계정 설정 → 보안 → 앱 비밀번호 추가 (생성된 앱 비밀번호는 다시 확인할 수 없으므로 기록 필수!!!!)
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("/");
  })
);
  • generateRandomPassword()는 임의의 문자열을 만들어주는 함수
  • 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('/update-password', ...
    await User.findOneAndUpdate({
        ...
        passwordReset: false,
});
 
반응형

'프로그래밍 > Node.js' 카테고리의 다른 글

[Node.js] 구글 로그인 구현하기  (0) 2021.12.15
[Node.js] OAuth란  (0) 2021.12.15
[Node.js] JWT + Cookie 사용하기  (0) 2021.12.15
[Node.js] JWT란?  (0) 2021.12.15
[Node.js] CSR로 댓글 기능 구현하기  (0) 2021.12.13