package
"passport": "^0.6.0",
"passport-jwt": "^4.0.0",
"@nestjs/passport": "^9.0.0",
"@nestjs/jwt": "^9.0.0",
"@types/passport-jwt": "^3.0.6",
Nest에서 client에서 들어온 request가 response로 반환될 때까지의 flow는 다음과 같다.
request -> middleware -> guard(인증 검토) -> interceptor -> controller -> httpexception filter -> response
이 때, 사용자 인증과 관련된 flow는 guard가 전담한다.
guard는 모든 것들의 모듈화/캡슐화를 강조하는 nest에서 interceptor, controller, filter와 더불어서, 특히 "인증/권한"과 관련한 역할 수행을 위해 분리해 둔 계층이라고 볼 수 있다.
guard.ts -> strategy.ts -> interceptor -> controller -> service -> repository -> response
@Injectable()
export class jwtStrategy extends PassportStrategy(Strategy) {
constructor(private readonly catsRepository: CatsRepository) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), //헤더에서 bearer type으로 활용
secretOrKey: process.env.secretKey, // 시크릿 키(인증용)
ignoreExpiration: false, // 만료 기간 지난 토큰을 허가하는지 여부
});
}
// 검증 메소드: 디코딩은 모듈 자체에서 자동으로 되는 것으로 보임.
async validate(payload: Payload) {
const cat = await this.catsRepository.findCatById(payload.id);
if (cat) {
return cat.readOnlyDATA; // request의 user 파라미터 안에 cat을 삽입.
} else {
throw new UnauthorizedException('등록된 고양이가 아닙니다.');
}
}
}