오늘은 JWT 모바일 인증에 더불어 사용할 수 있는 이메일 인증을 도입했다.
const signupCode = Math.random().toString(36).slice(2);
const transporter = nodemailer.createTransport(smtpTransport({
service: "gmail",
host: "smtp.gmail.com",
auth: {
user: process.env.DEVMAIL,
pass: process.env.DEVMAILPW,
},
}));
const mailOptions = {
from: "\"DediCats\" <dediCats16@gmail.com>",
to: email,
subject: "Email Verification for Dedicats",
html: `
<div style="text-align : center">
<img style="display : inline" src="https://lh3.google.com/u/0/d/1TqLpc4xvwkUTeLrRASDc2Y0c4nme8t3g=w1870-h975-iv1"/>
</div>
<p>Annyung Haseyo! ${nickname}!</p>
<p>Thanks for joining Dedicats! We really appreciate it. Please insert this code into email verfication to verify your account</p>
<h1>Your code is <br><span style="text-decoration:underline">${signupCode}<span></h1>
<h2>This code will only be valid for 1hour.</h2>
<p>if you have any problems, please contack us : dediCats16@gmail.com</p>`,
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log("Failed to send email");
res.status(409).send("Failed to send email");
} else {
console.log(`Email sent: ${info.response}`);
res.cookie("signupCode", signupCode, { maxAge: 1000 * 60 * 10, signed: true });
res.status(201).send("Successfully sent email");
}
});
먼저 이 기능을 구현하기 위해 nodemailer와 nodemailer-smtp-transport라는 모듈을 사용했다. 간단하게 nodemailer를 사용해 알려준데로 하면 원래 있는 계정을 사용해 원하는 곳으로 이메일을 보낼 수 있다. 우리의 경우에서는 리퀘스트에서 보내는 이메일 주소로 보내는 것인데 mailOptions을 사용해 세부사항을 결정할 수 있다.
from 에는 이메일을 보낼 때 어떤 이름으로 보낼지 정할 수 있고 to 는 보내는 타겟이다. subject는 이메일 주제이고 html은 그 안의 내용을 꾸며줄 때 사용한다. 우리는 이메일을 보내고 쿠키를 보내줘 클라이언트에서 쿠키를 열었을 때 그 코드가 이메일안의 코드와 일치하면 이메일 인증을 통과시킨다. 효과적일 것 같다.
나누어주고 새로 만들어준 함수를 폴더에 넣어주고 파일을 정리해주었다.
이제 클라이언트로 넘어가면 된다.