Node.js/NestJs

[User] Authentication #2 JWT Module

Ykie 2023. 4. 7. 18:55
728x90

이 방법은 굳이 필요 없고 더 간단한 방법도 있으나 Nestjs의 Module 구조의 이해를 위해 작업해 봄.

nest g mo jwt / nest g s jwt 를 통해 module / service 생성
JwtModule이 option을 갖고 활용할 수 있도록 Dynamic Module을 Return 하도록 Module 수정
module에서 service로 어떻게 injection 하는지는 아래와 같다.

// jwt.module.ts
@Module({})
@Global() // grobal 설정하면 해당 module에서 import 안해도 사용 가능.
export class JwtModule {
  static forRoot(options: JwtModuleOptions): DynamicModule {
    return {
      module: JwtModule,
      // providers: [JwtService],
	  // providers: [JwtService] 이 것은
	  // providers: [{
	  // provide: JwtService, class가 아닌 'Banana'처럼 value를 넣을 수도 있다
	  // useClass: JwtService, value를 넣을 때는 useValue: ~~ 라고 해줘야 한다.
	  // }]
	  // 이렇게 풀어서 쓸 수 있다.
      providers: [{ provide: CONFIG_OPTIONS, useValue: options }, JwtService],
      exports: [JwtService],
    };
  }
}


// jwt.service.ts
// module에서 useValue로 설정했다면 아래와 같이 가져와 사용하면 된다.
~~ JwtService{
...
  constructor(
    @Inject(CONFIG_OPTIONS) private readonly options: JwtModuleOptions,
  )
  sign(payload: object): string {
    return jwt.sign(payload, this.options.privateKey);
    // private key는 ConfigService가 grobal 이기 때문에 this.configService.get('PRIVAATE_KEY')로 가져올 수도 있다.
  }
  // payload의 경우 다양한 부서에서 공용으로 사용하게 될 수도 있고, 단순하게 id 값만 받아서 사용할 수도 있다.
  sign(userId: number):string {
    return jwt.sign({id: userId}, this.options.privateKey);
  }
}


// user.service.ts
const token = this.jwtService.sign({ id: user.id }); // 이렇게 적용


// jwt.constants.ts
export const CONFIG_OPTIONS = 'CONFIG_OPTIONS';


// jwt.interface.ts
export interface JwtModuleOptions {
  privateKey: string;
}


// app.modules.ts
...
JwtModule.forRoot({
  privateKey: process.env.PRIVATE_KEY,
}),
...

 

728x90