[NestJS] JWT토큰NestMiddleware 미들웨어

도도·2021년 8월 1일
0

기술Velog

목록 보기
6/28

NestMiddleware 미들웨어

목적

  • JWT토큰의 사용자 아이디 정보로, 완전한 사용자 정보로 만들어주자.

로직

  1. x-jwt 라는 key값이 header에 있는지 확인
  2. jwt 토큰을 해석하여 ,사용자 id를 해독한다.
  3. 사용자 id를 통해 사용자 정보를 읽고 req에 넣는다.

코드

  1. jwt.middleware.ts 의 구현
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
import { MemberService } from 'src/member/member.service';
import { JwtService } from './jwt.service';

@Injectable() // Injectable - nestJS
// NestMiddleware 을 구현한다. use라는 함수를 구현하자.
export class JwtMiddleWare implements NestMiddleware<Request, Response> {
  constructor(
    private readonly jwtService: JwtService, // 토큰을 object로 해독하기 위함
    private readonly memberService: MemberService, // 사용자 id로 full정보를 얻기 위함
  ) { }
  async use(req: Request, res: Response, next: NextFunction) {
    if ('x-jwt' in req.headers) {// jwt 토큰이 헤더에 있는지 확인
      const token = req.headers['x-jwt'];
      try {
        const decoded = this.jwtService.verify(token.toString()); // 토큰을 object로 변경한다.
        if (typeof decoded === 'object' && decoded.hasOwnProperty('email_id')) { // email_id 가 들어있는지 확인 
          const { ok, memberInfo } = await this.memberService.getMemberInfo({
            email_id: decoded['email_id'],// email로 사용자 정보를 얻어와서 req에 넣어주기
          });
          if (ok) req['memberInfo'] = memberInfo;
        }
      } catch (error) {
        console.log(error);
      }
    }
    next();
  }
}
  1. App.module에 미들웨어 적용
// NestModule 모듈을 구현하여, configure 함수를 작성한다. 
export class AppModule implements NestModule {
  // 위에서 작성한 미들웨어를 consumer에 적용 시킨다.
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(JwtMiddleWare).forRoutes({
      path: '*', // 특정 path 혹은 method에 대해서만 적용 시킬수도 있다.
      method: RequestMethod.ALL,
    });
  }
}
profile
프론트 주력의 JS 개발자 입니다.! Node.js, React, NestJS 에 관심이 많습니다.

0개의 댓글