NestJS JWT Auth Guard
JWT authentication guard with role-based access control for NestJS.
import {
CanActivate, ExecutionContext, Injectable, UnauthorizedException,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { JwtService } from '@nestjs/jwt';
import { Request } from 'express';
export const ROLES_KEY = 'roles';
export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles);
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private jwt: JwtService,
private reflector: Reflector,
) {}
async canActivate(ctx: ExecutionContext): Promise<boolean> {
const req = ctx.switchToHttp().getRequest<Request>();
const token = req.headers.authorization?.split(' ')[1];
if (!token) throw new UnauthorizedException();
try {
const payload = await this.jwt.verifyAsync(token, {
secret: process.env.JWT_SECRET,
});
req['user'] = payload;
} catch {
throw new UnauthorizedException();
}
const requiredRoles = this.reflector.getAllAndOverride<string[]>(
ROLES_KEY, [ctx.getHandler(), ctx.getClass()],
);
if (!requiredRoles) return true;
return requiredRoles.some((r) => req['user'].roles?.includes(r));
}
}