본문 바로가기

upco #4. 비밀번호 분실 시 메일 보내기 본문

개발/프로젝트

upco #4. 비밀번호 분실 시 메일 보내기

자전하는명왕성 2023. 3. 21. 19:39
반응형

오늘은 비밀번호 분실 시 메일 보내는 API를 추가했다.

yarn add @nest-modules/mailer nest-mailer

 

이전에 node.js에서 node-mailer를 사용해 본 적이 있어 사용이 그리 어렵지는 않았다.

 

https://github.com/nest-modules/mailer/blob/master/docs/mailer.md

먼저, 모듈에서는 docs 에서 제공하는대로 작성했는데,

내가 필요로 하지 않는 기본값이나 템플릿은 제거했다.

// Mail.Module

@Module({
  imports: [
	// 중략 // 
    MailerModule.forRootAsync({
      useFactory: () => ({
        transport: {
          service: process.env.MAIL_SERVICE, // 메일을 제공하는 서비스
          auth: {
            user: process.env.MAIL_AUTH_USER, // google email
            pass: process.env.MAIL_AUTH_PASSWORD, // 2차 비밀번호
          },
        },
      }),
    }),
  ],
  providers: [
    MailResolver, //
    MailService, //
  ],
})
export class MailModule {}

구글 2차 비밀번호 설정은 다른 곳에 많이 나와있으니 설명은 생략한다.

 

// mail.service
  async passwordResetMailer({ email }): Promise<string> {
  	// 회원으로 등록되어 있는 email이 아닐 시 반환되는 오류
    const user = this.userService.findOneByEmail({ email });
    if (!user) throw new NotAcceptableException();

    // 임시 비밀번호 생성 로직 및 업데이트 로직입니다.
    const renderNewPassword = this.renderNewPassword(); // 임시 비밀번호 생성 함수
    const input: IUsersServiceUpdateInput = {
      id: (await user).id,
      updateUserPwdInput: {
        password: renderNewPassword,
      },
    };
    await this.userService.update(input);

    // 메일 전송 로직입니다.
    try {
      await this.mailerService.sendMail({
        to: email,	// 메일을 받을 사람
        from: process.env.MAIL_AUTH_USER, // 메일을 보내는 사람
        subject: "[upco] : 임시비밀번호를 안내드립니다.", // 제목 
        html: `회원님의 임시 비밀번호는 ${renderNewPassword}입니다.`, // 내용
      });
    } catch (error) {
      console.log(error);
      throw new NotAcceptableException();
    }
    return "전송 완료";
  }

 

이후 로직은 다음과 같다.

 

비밀번호 변경하는 사람의 이메일을 통해, 해당 유저의 DB에 접근한 뒤,

임시적으로 랜덤하게 만든 비밀번호를 해당 데이터에 업데이트하고,

랜덤한 비밀번호를 이메일로 전송한다.

 

이때, 임시로 만든 비밀번호는 아래처럼 만들었으며,  6개의 숫자로 이루어진 문자열을 반환하게 하였다.

renderNewPassword() {
    return String(Math.floor(Math.random() * 1000000)).padStart(6, "0");
  }

 

이후 유저는 받은 이메일에 담긴 비밀번호로 로그인 시 정상적으로 로그인에 성공할 수 있게 된다.

 

반응형
Comments