nest g module auth
nest g service auth
CLI에서 auth 담당 module
과 service
를 생성한다.
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()
의 secret
과 jwt.strategy.ts
의 super
의 secretOrKey
값을 똑같이 맞추어준다.