nestjs 강의를 들으면서 로그인/인증 기능을 배웠는데
graphql을 사용하는 방식으로 진행해서 req,res를 가져오는 방식이 조금 달랐다.
나는 graphql을 사용하지 않고 프로젝트를 진행하고 싶어서 공식문서와 구글 검색을 통해 아래와 같이 코드를 짰다.
auth.controller.ts
import {
Body,
Controller,
Post,
Res,
} from '@nestjs/common';
import { AuthService } from './auth.service';
import { Response } from 'express';
@Post()
login(
@Body('email') email: string, //
@Body('password') password: string, //
@Res({ passthrough: true }) res: Response, // res.cookie 셋팅을 위해 추가해줌
): Promise<string> {
return this.authService.login({ email, password, res });
}
auth.service.ts
async login({ email, password, res }: IAuthServiceLogin): Promise<string> {
const user = await this.usersService.findOneByEmail({ email });
if (!user)
throw new UnprocessableEntityException(
'존재하지 않는 이메일입니다.',
);
const isAuth = await bcrypt.compare(password, user.password);
if (!isAuth)
throw new UnprocessableEntityException('비밀번호가 틀렸습니다.');
// 리프레시토큰 만들어 브라우저 쿠키에 저장해 보내줌
this.setRefreshToken({ user, res });
// 엑세스토큰 만들어 리턴
return this.getAccessToken({ user });
}
// 리프레시토큰 만드는 함수
setRefreshToken({ user, res }: IAuthServiceSetRefreshToken): void {
// 리프레시토큰 생성
const refreshToken = this.jwtService.sign(
{ sub: user.id },
{ secret: process.env.REFRESH_SECRET_KEY, expiresIn: '2w' },
);
// 쿠키 셋팅 1번 방법 -> cookie-parser, @types/cookie-parser 두 패키지 다운받아서 import 하여 사용 가능.d
// res.cookie('set-Cookie', refreshToken, {
// domain: 'localhost',
// path: '/',
// httpOnly: true,
// });
// 쿠키 셋팅 2번 방법
res.setHeader('set-Cookie', `refreshToken = ${refreshToken}; path=/;`);
}