이 글에서는 NestJS 기반 어플리케이션에서 JWT(JSON Web Token)를 이용하여 관리자 인증을 구현하는 방법에 대해서 알아보겠습니다.
npm install --save @nestjs/passport passport passport-jwt @nestjs/jwt jwt-decode
// user.entity.ts
@Entity()
export class User extends BaseEntity {
// ...
@Column()
role: 'user' | 'admin';
}
// auth.service.ts
async signIn(user: User): Promise<{ accessToken: string }> {
const payload: JwtPayload = { id: user.id, username: user.username, role: user.role };
const accessToken: string = await this.jwtService.sign(payload);
return { accessToken };
}
// admin-auth.guard.ts
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class AdminAuthGuard extends AuthGuard('jwt') {
canActivate(context: ExecutionContext) {
const canActivate = super.canActivate(context);
if (!canActivate) {
return false;
}
const request = context.switchToHttp().getRequest();
return this.validate(request);
}
validate(request) {
return request.user && request.user.role === 'admin';
}
}
@UseGuards
데코레이터를 사용해 AdminAuthGuard
를 적용하세요.// admin.controller.ts
import { Controller, Get, UseGuards, Request } from '@nestjs/common';
import { AdminAuthGuard } from './admin-auth.guard';
@Controller('admin')
@UseGuards(AdminAuthGuard) // 관리자 인증 가드를 적용
export class AdminController {
@Get()
async getAdminDashboard(@Request() req) {
return { message: 'Admin dashboard', user: req.user };
}
}
좋은 글 감사합니다.