← NestJS コース
13. ガード — 認証・認可の入口
ガードは「このリクエストを処理してよいか」をハンドラ実行前に判定する部品です。CanActivate インターフェースを実装したクラスを作り、canActivate() で true を返せば通過、false を返せば 403 Forbidden で拒否されます。適用は @UseGuards() デコレータで行います。
実務ではログイン済みかを確認する認証や、管理者権限の有無を調べる認可に使います。各ハンドラの先頭に認証チェックの if 文を書く代わりに、ガード1つをコントローラ全体やアプリ全体へまとめて適用できるのが利点です。
判定に必要なリクエスト情報は context.switchToHttp().getRequest() で取り出します。ガードはあくまで通す・通さないの判定役に徹し、トークン解析などの重いロジックはサービスに任せると見通しが良くなります。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import {
CanActivate, ExecutionContext, Injectable,
Controller, Get, UseGuards,
} from "@nestjs/common";
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
// false を返すと 403 Forbidden になる
return request.headers["authorization"] !== undefined;
}
}
@Controller("admin")
@UseGuards(AuthGuard) // コントローラ全体に適用
export class AdminController {
@Get()
findSecret() {
return { secret: true };
}
}