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