[First Project] 회원 이메일로 비밀번호 변경 링크 보내기(Edit PW)

hailey·2020년 11월 7일
0

FirstProject

목록 보기
12/14
post-thumbnail

*이 이슈는 nightmare에 해당된다. Flow와 API는 임의로 작성한 것이다.
현재 이 기능을 위한 버튼과 페이지가 기획 및 구축되어 있지 않고, 내 로직 상으로는 데이터베이스를 업데이트해야 하는 데다가 이 포스팅에 적힌 단계까지 코딩한 후 bare minimum을 수정하느라 더 이상 진행하지 못했다.

1. 비밀번호 변경 flow 정리

1) 비밀번호 변경을 요청한 회원이 데이터베이스에 존재하는지 확인(findOne)
2) 서버에서 토큰을 생성하여 데이터베이스에 저장
3) nodemailer를 통해 회원 이메일로 토큰 전송
4) 회원은 링크에 접속하여 새로운 비밀번호 설정하고(여기서 유효성 검사 실시?) 서버로 전송
5) 서버에서는 회원이 보낸 토큰값이 데이터베이스에 저장된 토큰과 일치하는지 확인 후
6) update 쿼리문으로 비밀번호 재설정 완료

2. API

[BODY] useremail

  • Response

200: OK

{sucess: true}

500: Internal Server Error

err

3. 코드 작성 과정

const { users } = require('../../models');
const crypto = require('crypto');
const nodemailer = require('nodemailer');

const user = process.env.findpw_mail;
const password_send = process.env.findpw_pw;

module.exports = {
  post: (req, res) => {
    const { useremail } = req.body;

    users
      .findOne({
        where: {
          email: useremail,
        },
      })
      .then((user) => {
        const token = crypto.randomBytes(20).toString('hex');
        const data = {
          token,
          email: useremail,
          ttl: 3600,
        };
        //token.create(data) // 예를 들면 토큰테이블에 데이터 생성
      });

    const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: user,
        pass: password_send,
      },
    });
    const emailOptions = {
      from: user,
      to: useremail,
      subject: 'S*FU 비밀번호 변경 이메일입니다.',
      html:
        '아래의 URL을 클릭하시면 비밀번호 변경 페이지로 연결됩니다.' +
        `http://localhost/users/edit/pw/${token}`,
    };
    //전송
    transporter
      .sendMail(mailOptions, function (error, info) {
        if (error) {
          console.log(error);
          next(error);
        } else {
          console.log('Email sent: ' + info.response);
          return res.status(200).json({ success: true });
        }
      })
      .catch((err) => {
        res.status(500).send('err');
      });

    // 이후 토큰테이블에서 비밀번호를 수정해준다
    // token.findOne({
    //   where: {
    //     token: {
    //       ??: ??
    //     },
    //     created: {
    //       ??: ??
    //     }
    //   }
    // }).then((user) => {
    //   User.update(...)
    // })
  },
};

3-1. 참고한 고마운 글들

1) clone에 가깝게 참고했다. 정리를 정말 잘해주셨다!
https://techlog.io/Server/Node-js/node-js%EC%97%90%EC%84%9C-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%B4%88%EA%B8%B0%ED%99%94-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0/

2) 위의 블로그를 참고한 또 다른 사례
https://velog.io/@yhe228/nodemailer-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%B4%88%EA%B8%B0%ED%99%94-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84

3) async.waterfall
https://m.blog.naver.com/umpirage98/221457951923




➤계속 공부하고 있습니다. 더 나은 의견과 질문이 있으시다면 언제든, 어떤 경로로든 이야기해주세요.

profile
옳고 그름을 고민합니다

0개의 댓글