[Node.js] 회원 비밀번호 찾기 구현, 메일 발송 기능
글 작성자: 망고좋아
반응형
🎯 회원 비밀번호 찾기 구현
📝 로직
- 임의의 문자열로 비밀번호 초기화
- 초기화된 문자열을 메일로 전달 → 메일 발송 기능 개발 필요
- 초기화 후 첫 로그인 시 비밀번호 변경 요청
📝 메일 발송 기능 구현 방법
📕 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 |
댓글
이 글 공유하기
다른 글
-
[Node.js] 구글 로그인 구현하기
[Node.js] 구글 로그인 구현하기
2021.12.15 -
[Node.js] OAuth란
[Node.js] OAuth란
2021.12.15 -
[Node.js] JWT + Cookie 사용하기
[Node.js] JWT + Cookie 사용하기
2021.12.15 -
[Node.js] JWT란?
[Node.js] JWT란?
2021.12.15