반응형
1. jwt-auth.guard.ts에서는 헤더에서 토큰 빼고 request.user에 넣는다 .
import {
CanActivate,
ExecutionContext,
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private readonly jwtService: JwtService) {}
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const token = this.extractToken(request);
if (!token) {
throw new UnauthorizedException('토큰이 없습니다');
}
try {
const payload = this.jwtService.verify(token, { secret: 'jwtwt' });
request['user'] = payload;
return true;
} catch {
throw new UnauthorizedException('유효하지 않은 토큰입니다');
}
}
private extractToken(request: any): string | null {
const authHeader = request.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return null;
}
return authHeader.split(' ')[1];
}
}
2. @CurretUser에서는 request.user를 파라미터로 보낸다. (@CurrentUser를 파라미터데코레이터로 정의)
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const CurrentUser = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
- createParamDecorator = 반환값을 파라미터에 넣어주는 함수 만들기.
3. CurrentUser에서 반환하는 user는 guard의 토큰이 해독된 유저임. 서비스로직을 거칠 필요 없이 바로 프론트에 응답으로 뿌려준다.
@UseGuards(JwtAuthGuard)
@Get('me')
getMe(@CurrentUser() user: { id: number }) {
return user;
}
반응형