jwt로 middleware를 만들어서
req시 req에 user가 있는지 user가 누군지 확인할 수 있다.
req와 res사이에 넣어준다.
https://docs.nestjs.com/middleware
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()로 넘긴다.
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를 넣어준다.
@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 해 줄것.