Dev Study
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 };
  }
}
公式ドキュメントで詳しく ↗