관리 메뉴

Mini

[Nest JS] Passport , jwt => 토큰인증후 유저정보 가져오기 / @UseGuard 미들웨어 본문

JS/Nest.js

[Nest JS] Passport , jwt => 토큰인증후 유저정보 가져오기 / @UseGuard 미들웨어

Mini_96 2024. 8. 18. 22:35

 

우리는 4번까지했음

토큰생성후, 클라는 요청을 보낼때 토큰을 같이보내는데, 이 토큰을 검증하는 작업을 할것임!

 

 

npm install @types/passport-jwt --save

 

* jwt-strategy 구현

import { PassportStrategy } from "@nestjs/passport";
import { Injectable, UnauthorizedException } from "@nestjs/common";
import { ExtractJwt, Strategy } from "passport-jwt";
import { InjectRepository } from "@nestjs/typeorm";
import { UserRepository } from "./user.repository";
import { User } from "./user.entity"; //passport아님에 주의

@Injectable() //어디에서나 사용가능토록
export class JwtStrategy extends PassportStrategy(Strategy){
  constructor(
    @InjectRepository(UserRepository) //db사용해야 하므로 주입
    private userRepository : UserRepository
  ) {
    super({
      secretOrKey: 'Secret1234', //검증용 시크릿키, 모듈에서 설정해준거랑 같은값
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken() //Bearer토큰 타입으로 올거임
    })
  }

  async validate(payload){
    const {username} = payload;
    const user : User = await this.userRepository.findOneBy({username});

    if(!user){
      throw new UnauthorizedException();
    }

    return user;
  }
}

* 모듈 추가

@Module({
  ...
  providers: [... JwtStrategy], //해당 auth모듈에서 사용가능토록
  exports: [JwtStrategy, PassportModule] //다른 모듈에서 사용가능토록

* 컨트롤러

@Post('/test')
test(@Req() req){
  console.log('req',req);
}

 

*문제 : return user 했는데, 안나옴

* 컨트롤러에서 미들웨어추가

@Post('/test')
@UseGuards(AuthGuard())
test(@Req() req){
  console.log('req',req);
}

 

user정보 리턴되는 모습
이상한 토큰을 넣으면 미들웨어에서 걸러진다.