NestJs 이메일 인증 기능구현

2024. 4. 20. 19:46NestJs

728x90
반응형

이메일 인증 구현하기!

저는 https://velog.io/@cherie/nest.js-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0 여기 사이트를 참고하여 만들었습니다.

 

 

1. 패키지 설치

npm install --save @nestjs-modules/mailer nodemailer

 

nest g mo mail
nest g co mail
nest g s mail

 

먼저 이메일 인증 구현할수있게 패키지와 폴더를 생성합니다.

 

 

4. Trasport 적용

보내는 이메일을 구글 이메일로 보낼 거기 때문에 구글 메일에서 설정을 해주어야 했습니다.

 

 

 

 

 

// MailModule
import { Module } from '@nestjs/common';
import { MailerModule } from '@nestjs-modules/mailer';
import { MailService } from './mail.service';
import { MailController } from './mail.controller';
import { UsersModule } from 'src/users/users.module';
import { UsersService } from 'src/users/users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Users } from 'src/entities/Users';

@Module({
  imports: [
    MailerModule.forRootAsync({
      useFactory: () => ({
        transport: {
          host: 'smtp.gmail.com',
          port: 465,
          auth: {
            user: process.env.EMAILADDRESS,
            pass: process.env.EMAILPASSWORD,
          },
          secure: true
        },
        defaults: {
          from: `'Waa' <${process.env.EMAILADDRESS}>`,
        },
      }),
    }),
    UsersModule,
    TypeOrmModule.forFeature([Users]),
  ],
  controllers: [MailController],
  providers: [MailService, UsersService],
  
})
export class MailModule {}

 

env파일에 EMAILADDRESS, EMAILPASSWORD를 작성해주어야합니다  여기서 EMAILPASSWORD는 앱 키 비밀번호를 작성해주시면 됩니다.

 

// MailController

@Controller('api/mail')
export class MailController {
  constructor(
    private readonly mailService: MailService,
    private readonly userService: UsersService,
  ) {}

  @Get(':email')
  async sendEmail(@Param('email') email: string) {
      return await this.mailService.sendEmail(email);
    }
  

  @Get(':verificationCode/:email')
  async emailCertified(
    @Param('verificationCode') verificationCode: string,
    @Param('email') email: string,
  ) {
    return await this.mailService.verifyCode(verificationCode, email);
  }
}

 

두개의 API가 있는데 sendEmail은 이메일로 전송하는 API고 emailCertified API는 인증코드를 받았을때 처리하는 API입니다.

저는 controller에서는 클라이언트에서 받는값과 보내는값을 respnse하는 역할만 하였습니다.

 

// MailService
@Injectable()
export class MailService {
  constructor(
    @InjectRepository(Users)
    private usersRepository : Repository<Users>,
    private readonly usersService: UsersService,
    private readonly mailerService: MailerService,
  ) {}

  async sendEmail(email: string) {
    const result = await this.usersService.findEmail(email);
    if (!result) {
      return { data: '존재하지 않는 이메일입니다.' };
    }
  
    const temporaryCode = this.generateTemporaryCode();
    const expirationTime = new Date();
    expirationTime.setMinutes(expirationTime.getMinutes() + 5);
  
    try {
      await this.mailerService.sendMail({
        to: email,
        subject: 'test',
        html: `<p>인증코드: <strong>${temporaryCode}</strong>드립니다.</p>`,
      });
      
      await this.usersRepository.update({ email: email }, { verificationCode: temporaryCode, expirationTime: expirationTime });
  
      return { data: '인증코드를 전송했습니다.' };
    } catch{
      return { data: '이메일 전송 중 오류가 발생했습니다.' };
    }
  }

  private generateTemporaryCode(): string {
    const temporaryCode = randomBytes(3).toString('hex').toUpperCase(); 
    return temporaryCode;
  }

  async verifyCode(verificationCode: string, email: string) {
    const user = await this.usersRepository.findOne({ where: { email, verificationCode } });
    if (user && user.expirationTime > new Date()) {
        return { data: user.email };
    } else {
        return { data: '유효한 코드가 아닙니다.' };
    }
}
}

 

service에서 sendEmail를 보겠습니다. 이메일을 받아 판별해서 예외처리를 하고 인증코드를 랜덤으로 생성하여 메일로 전송합니다.

verifycode API는 인증코드를 받아 유효한 인증코드인지 판별하여 이메일을 전송합니다. 

 

테스트를 하니 Postman에서는 성공적 메시지와 상태코드가 나왔습니다. 이제는 메일을 들어가서 정상적으로 메일이 왔는지 봐야겠죠?!?

 

메일까지 완벽하게 전송이 완료되었습니다.

728x90
반응형

'NestJs' 카테고리의 다른 글

[NestJS] 모듈 구성 요소  (0) 2024.06.27
[NestJs] Express와 NestJS차이  (0) 2024.06.26
[Nest.js] config 에러  (0) 2024.05.06
[NestJs] module 에러  (0) 2024.04.30
NestJs session  (2) 2024.03.06