비밀번호를 까먹었을 때 해당 이메일로 임시비밀번호를 이메일로 보내주도록 해보자. token방식으로 하면 비밀번호를 변경할 수 있도록 url을 보내줄 수 있지만 나는 추가로 토큰을 발급하지 않고 그냥 임시비밀번호를 발급해 메일로 보내주고 해당 유저의 비밀번호를 임시비밀번호로 바꾸게 만들었다.
// auth.module.ts
import { MailerModule } from '@nestjs-modules/mailer';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
@Module({
imports: [
PassportModule.register({ session: true }),
TypeOrmModule.forFeature([Users]),
MailerModule.forRoot({
transport: {
service: process.env.NODEMAILER_SERVICE,
host: process.env.NODEMAILER_HOST,
port: 587,
secure: false,
auth: {
user: process.env.NODEMAILER_USER,
pass: process.env.NODEMAILER_PASS,
},
template: {
dir: process.cwd() + '/template/',
adaptor: new HandlebarsAdapter(),
options: {
strict: true,
},
},
},
}),
],
controllers: [AuthController],
providers: [
AuthService,
GoogleStrategy,
GithubStrategy,
LocalStrategy,
LocalSerializer,
],
})
export class AuthModule {}
// auth.service.ts
import generator from 'generate-password';
import { MailerService } from '@nestjs-modules/mailer';
@Injectable()
export class AuthService {
constructor(
@InjectRepository(Users) private usersRepository: Repository<Users>,
private readonly mailerService: MailerService,
) {}
...
async sendMail(email: string) {
const user = await this.usersRepository.findOne({
where: { email },
});
if (!user) {
throw new NotFoundException('해당 유저를 찾을 수 없습니다');
}
const password = generator.generate({ length: 10, numbers: true });
const hashedPassword = await bcrypt.hash(
password,
parseInt(process.env.BCRYPT_SALT_ROUNDS),
);
try {
await this.mailerService.sendMail({
to: email,
from: 'Dimelo Team',
subject: '<Dimelo> 임시 비밀번호 발급',
html: `임시 비밀번호 입니다. 해당 비밀번호로 로그인 후 비밀번호를 변경해주세요 : ${password}`,
});
return this.usersRepository.save({
...user,
password: hashedPassword,
});
} catch (err) {
console.log(err);
}
}
나는 우선 간단하게 테스팅 해보기 위해 mailtrap이라는 서비스를 사용했는데 메세지가 잘 전달한 것을 볼 수 있었다. 구글이나 네이버 서비스를 이용할 수 있는데 어떤 것을 사용할지는 좀 더 찾아봐야겠다.