Jwt middleware

김종민·2022년 6월 27일
0

Nuber-Server

목록 보기
10/34


jwt로 middleware를 만들어서
req시 req에 user가 있는지 user가 누군지 확인할 수 있다.
req와 res사이에 넣어준다.

https://docs.nestjs.com/middleware

1. jwt/jwt.middleware.ts


import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
import { UserService } from 'src/users/users.service';
import { JwtService } from './jwt.service';

@Injectable() ///Injectable type으로 설정한다.
export class JwtMiddleware implements NestMiddleware {
  constructor(
    private readonly jwtService: JwtService,
    private readonly userService: UserService,
  ) {}
  ///JwtService와 UsersService를 constructor에서 불러준다.
  ///UserService는 user.module에서 export할 것!
  ///JwtMiddleware는 class로 만들고 implements NestMiddleware를 해준다.
  
  async use(req: Request, res: Response, next: NextFunction) {
  ///use 및 req, res, next부분은 위와 같이 코딩
  
    if ('x-jwt' in req.headers) {
      const token = req.headers['x-jwt'];
      ///token을 'x-jwt'에 담아주기 떄문에, req.headers에서 token을
      ///있는지 확인하고 뽑아낸다.
      
      try {
        const decoded = this.jwtService.verify(token.toString());
        if (typeof decoded === 'object' && decoded.hasOwnProperty('id')) {
          const user = await this.userService.findById(decoded['id']);
          req['user'] = user;
        }
      } catch (e) {}
    }
    next();
  }
}

///그런다음, jwtService에 있는 함수인 verify를 이용해서 token을 decoded한다.
///decoded해서 id를 뽑아낸 다음, userService의 findById 함수를 사용해서
///user를 찾아준다. 그리고 req의 user에 찾아낸 user를 담아준다.
///고런 다음, next()로 넘긴다.

2. app.module.ts

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(JwtMiddleware).forRoutes({
      path: '/graphql',  ==>적용path, '/*' => 모든path
      method: RequestMethod.ALL,  ==>GET, POST, ALL 세개중에 choice
    });

///위에서 만든 Middleware를 적용시키시 위해서 app.module.ts의
///AppModule class에 위와 같이 코딩한다.
///consumer.apply에 적용할 middleware를 넣어준다.

3. user.module.ts

@Module({
  imports: [TypeOrmModule.forFeature([User]), ConfigService],
  providers: [UserResolver, UserService],
  exports: [UserService],
})
export class UsersModule {}

///JwtMiddleware에서 UserService의 함수를 사용하기 위해 export해줌.

1.미들웨어 만드는 방법은 문법처럼 정형화 되어 있는 부분이 많아서,
잘 봐둘것.
2. main.ts에서 app.use(JwtMiddleware)로 적용시키기 위해서는 JwtMiddleware를
함수로 만들어 주어야함. 여기서는 class로 만들어줬음.
3. 다른 모듈에서 service.ts의 함수를 사용하기 위해서는 반드시
module에서 exports 해 줄것.

profile
코딩하는초딩쌤

0개의 댓글