jwt 관련 모듈 생성


nest g module auth
nest g service auth

CLI에서 auth 담당 moduleservice를 생성한다.

jwt를 사용해야하기 때문에 jwt폴더에 jwt.strategy.ts 파일과 jwt.guard.ts 파일을 생성한다.

jwt.strategy.ts ( jwt에 대한 설정을 담당하는 파일 )

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy, ExtractJwt } from 'passport-jwt';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), // Header의 token에서 추출
      secretOrKey: 'secret', // key, 유출되면 안됨, AuthModule의 JwtModule.register의 secret와 맞춰줘야한다.
      igonoreExpiration: false, // 만료되는 기간
    });
  }
  // async validate(payload) {}
}

jwt.guard.ts

import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}

해당 jwt를 AuthModule에서 사용하려면 다음과 같이 작성한다.

auth.module.ts

import { Module, forwardRef } from '@nestjs/common';
import { AuthService } from './auth.service';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt/jwt.strategy';
import { CatsRepository } from 'src/cats/cats.repository';
import { CatsModule } from 'src/cats/cats.module';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt', session: false }),
    JwtModule.register({
      secret: 'secret',
      signOptions: { expiresIn: '1y' },
    }),
    forwardRef(() => CatsModule), // 순환 모듈 문제 (CatsModule에서 AuthModule imports, AuthModule에서 CatsModule imports)
    // CatsModule, // providers에 집어넣지 않고 module자체를 import , cats module의 export 된 것을 사용할 수 있다.
  ],
  providers: [AuthService, JwtStrategy],
  exports: [AuthService], // cats.controller에서 사용해야하기 때문에 exports 해준다.
})
export class AuthModule {}

 JwtModule.register({
      secret: 'secret',
      signOptions: { expiresIn: '1y' },
    }),

JwtModule.register()secretjwt.strategy.tssupersecretOrKey 값을 똑같이 맞추어준다.