Search

#032 #passport와 인증 / custom decorator

  요청 검증 하기

 catsController > getCurrentCat 메소드

이렇게 @UseGuards 데코레이터를 요청 메소드 위에 달아주면, jwt검증후 req로 요청 데이터를 전달한다.
작동 순서 ( JwtAuthGuard > JwtStrategy > validate함수 )
이 validate 함수에서 jwt를 디코딩하여 검증해야 된다.

 Payload 타입 생성

 jwt.payload.ts

export type Payload = { email: string; id: string; };
JavaScript
복사
jwt 폴더 내부에 payload파일을 생성해서 Payload 타입을 정의한다.

 JwtStrategy > Validate 함수

 정의

catsRepository 의존성 주입 → payload 내부에 사용자 email과 id가 있을 것이므로 이 정보로 검증을 해야된다. catsRepository.findCatByIdWithoutPassword로 검증로직 구현해야된다.

 catsRepository > findCatByIdWithoutPassword

// Id로 고양이 찾으면서 비번은 제외하고 가져오기 async findCatByIdWithoutPassword(catId: string): Promise<Cat | null> { const cat = await this.catModel.findById(catId).select('-password'); return cat; }
JavaScript
복사
여기서 주의깊게 봐야하는 것은 select 함수이다. → 스키마에서 어떤 항목을 제외하고 싶다면 ‘-password’ : -와 필드값을 넣으면 그 항목을 제외하고 cat객체를 구성한다. → 스키마에서 어떤 항목들만 가져오고 싶다면 ‘email name’ : 이렇게 필드값과 띄어쓰기를 넣으면 cat객체로 email과 name만 가져오게 된다.

 catsController > getCurrentCat 테스트

→ UseGuards에서 jwt검증을 하고 → @Req로 파라메터로 전달된다. → 파라메터가 어떻게 전달 되었는지 확인하기 위해서 req.user 를 찍어보는데, 이게 헷갈릴 수 있다. 왜냐하면 나는 cat을 리턴했는데, req.user로 꺼내서 확인 하니까.. 이 원인은 passport-jwt 에서 내장된 기능이 validate 함수로 리턴되는 값을 req.user에 할당하기 때문

 postman 테스트

설정한대로 password를 제외하고 데이터가 반환 되었다.

 Custom Decorator

 파일 생성

common > decorators 내부에 cats.decorators.ts를 생성

 정의

import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const CurrentCat = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.user; }, );
JavaScript
복사
이렇게 파라메터 데코레이터를 커스터 마이징 할 수 있다.

 사용

원래 파라메터에 @Req() req: Request 라고 들어갔던 파라메터가 깔끔하게 커스터 마이징 되었다. 하지만 이대로 리턴하면 스키마 전체를 리턴하게 되니까, 일전에 만들었던 readOnlyData를 리턴해주자. (dto같은거)

 readOnlyData 리턴

결국 원래는 req.user 이었지만, 커스텀 데코레이터를 사용해 cat.readOnlyData가 리턴되었다 .

 postman 확인

우리가 원하는 필드만 리턴된 모습

 로그아웃 api는 필요없음

JWT를 프론트에서 그냥 버리면 되는 것이기 때문에 필요없다.