-
Notifications
You must be signed in to change notification settings - Fork 0
[BE] @OptionalGuard 데코레이터
강창한 edited this page Mar 12, 2024
·
2 revisions
작성자 : 창한
서비스 중 동일한 요청에 로그인 여부에 따른 분기처리를 하고 싶어요.
ex) 모임 리스트 반환 API → 로그인한 사용자에게는 내가 속한 모임을 추가적으로 제공
@UseGuards()를 사용하면 비회원 접근이 불가능하고, 안붙이면 로그인 정보를 가져올 수가 없어요
-
NestJS의
Reflector
를 활용하여 class의 MetaData에OptionalGuard
라는 정보를 추가하는 데코레이터를 만듭니다.// decorator.ts import { SetMetadata } from '@nestjs/common'; export const OPTIONAL_GUARD = 'OptionalGuard'; export const OptionalGuard = () => { return SetMetadata(OPTIONAL_GUARD, true); };
-
UseGuard의
TokenAuthGuard
의 메소드를 상속 구현(override)을 추가합니다.-
이를 사용하기 위해서 생성할 때
Reflector
를 주입받도록 코드를 수정합니다.// auth.guard.ts @Injectable() export class TokenAuthGuard extends AuthGuard('jwt') { constructor(private reflector: Reflector) { super(); } ... }
-
앞서 주입받은
OptionalGuard
라는 정보를 토대로 아래와 같이 분기하여 에러 처리를 합니다.// auth.guard.ts export class TokenAuthGuard extends AuthGuard('jwt') { ... handleRequest(err: any, user: any, info: any, context: ExecutionContext) { const optional = this.reflector.getAllAndOverride<boolean>(OPTIONAL_GUARD, [ context.getHandler(), context.getClass(), ]); if (optional && !user) { return null; } if (err || !user) { throw err || new UnauthorizedException(); } return user; } }
-
최종 코드
// auth.guard.ts import { ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { OPTIONAL_GUARD } from '@src/decorator'; @Injectable() export class TokenAuthGuard extends AuthGuard('jwt') { constructor(private reflector: Reflector) { super(); } handleRequest(err: any, user: any, info: any, context: ExecutionContext) { const optional = this.reflector.getAllAndOverride<boolean>(OPTIONAL_GUARD, [ context.getHandler(), context.getClass(), ]); if (optional && !user) { return null; } if (err || !user) { throw err || new UnauthorizedException(); } return user; } }
-
UseGuards를 사용할 때 데코레이터를 함께 붙여줘요.(순서무관)
@OptionalGuard()
@UseGuards(TokenAuthGuard)
⇒ 어떻게 순서 무관하게 가능한 지, 컴파일 단계의 지식까지는 추가 학습이 필요합니다..!(아직 잘 몰라요..)
// GET /groups
@OptionalGuard()
@UseGuards(TokenAuthGuard)
@Get()
async getAllGroups(@Req() { user }, @Query() findOptions, paginationOptions) {
console.log('user: ', user);
}
- JWT 토큰이 있을 때
- 요청
- 결과
- JWT 토큰이 없을 때
- 요청
- 결과
Reference
decorator
optional_authentication_in_nestjs-stackoverflow
Reflector-NestJS
Reflect-MDN
nestjs-custom-decorator-toss
MetaData
중복코드 따운 ! 재사용성 비상 ! mapped-type나와 !
- [FE] 성능 최적화(디바운스와 쓰로틀링)
- [FE] 채팅-1 채팅을 어떻게 저장할까?
- [FE] 채팅-2 읽지 않은 사람 수를 어떻게 계산할까?
- [FE] 채팅-3 프로필을 보여주는 경우
- [FE] 채팅-4 프로필을 보여주는 경우
- [FE] 채팅-5 프로필을 보여주는 경우
- [FE] 무한스크롤과 IntersectionObserver hook 만들기
- [FE] recoil의 atomFamily 사용하기
- [FE] 반응형 스켈레톤 UI 만들기
- [FE] svg파일을 React에서 컴포넌트처럼 사용하기
- [BE] 채팅방 이벤트 정리
- [BE] 안읽은 사람수 계산하기
- [BE] 크롤러 캐싱
- [BE] 네이버 소셜 로그인
- [BE] 테마 관련 API 캐싱적용
- [BE] S3을 사용해보았어요
- [BE] 성능테스트 환경 구축
- [BE] 채팅 아키텍처 구성하기
- [BE] swagger가 작성한 코드보다 길어질 때
- [BE] @OptionalGuard 데코레이터
4주차 회의록
5주차 회의록
6주차 회의록
- 12.09(토)