NestJS

NestJS と GraphQL で JWT 認証を構築する手順

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

環境構築と NestJS プロジェクトの作成

このセクションでは、Node.js と npm のバージョン確認から Nest CLI によるプロジェクト生成までを順番に示します。正しいバージョンが揃っていれば数分で開発環境が完成し、そのまま次の設定フェーズへ移行できます。

Tip
nest new コマンドは最新のテンプレートを自動で取得するため、手動設定ミスが起きにくいです。生成後は Git リポジトリへコミットしておくと、サンプルコードとの比較が容易になります。


GraphQL モジュール設定(Code First と Schema First の選択)

NestJS では 2 種類のスキーマ定義手法 が提供されます。以下でそれぞれの概要と実装例を示すので、プロジェクト要件に合わせて最適な方式を選んでください。

Code First アプローチでのスキーマ自動生成

Code First は TypeScript クラスから GraphQL スキーマを自動生成します。型安全性が高く、IDE の補完機能も活用できる点がメリットです。

ポイント
autoSchemaFile: true は「一時的なファイルに出力」ではなく、デフォルトでプロジェクトルートに schema.gql を作成します。明示的にパスを指定すれば任意のディレクトリへ出力でき、CI 環境でも差分管理がしやすくなります。

Schema First アプローチで SDL(Schema Definition Language)を手書き

既存の GraphQL スキーマがある場合やフロントエンドチームとスキーマ駆動開発を行う際に有効です。SDL ファイルから TypeScript の型定義も自動生成できます。

ポイント
typePathsdefinitions.path を併用することで、SDL の変更が即座に型安全なコードへ反映されます。


認証基盤の構築:AuthModule と JwtModule 設定、UserService のモック実装

この章では JWT 発行・検証ロジックAuthModule に集約し、ユーザー検索はインメモリの UserService で代用します。実運用時には DB 接続に差し替えるだけで利用できます。

JwtModule のシークレットと有効期限設定

ダミーユーザーを保持する UserService

ポイント
AuthServiceUserService を呼び出すだけで認証フローが完結します。DB に差し替える際は UserService の実装だけを書き換えれば他のコードは変更不要です。


Passport と JWT ストラテジーの統合

Passport は NestJS が提供する Guard 機構と組み合わせることで、リクエストレベルで認証結果を request.user に自動注入します。以下に実装上の重要ポイントを示します。

JwtStrategy の実装

認証が必要な GraphQL Resolver の書き方

ポイント
従来の req.user に依存した実装から、GraphQL 用に統一された ctx.user へ置き換えることで、HTTP と GraphQL の両方で同じ Guard ロジックを再利用できます。


GraphQL コンテキストへの認証情報注入と GqlAuthGuard/RolesGuard

Apollo Server が提供する context 関数で JWT を解析し、GraphQL の実行コンテキストにユーザー情報を埋め込む方法を解説します。続いてロールベースの認可ガードまで実装します。

Apollo Server の context でトークン抽出

GqlAuthGuard:Passport の JWT Strategy を GraphQL に橋渡し

ロールベース認可のための Roles デコレータと Guard

Guard の組み合わせ例(管理者専用クエリ)

ポイント
GqlAuthGuard が JWT を検証し、結果のユーザーオブジェクトは GraphQL コンテキスト (ctx.user) に格納されます。RolesGuard はその情報を元にロールチェックを行うので、認可ロジックが一貫して動作します。


Refresh Token の実装概要と e2e テスト

アクセストークンは短時間で期限切れになるため、リフレッシュトークン を別途管理し、無駄な再ログインを防ぎます。以下では HttpOnly Cookie に保存する安全な設計と、実際に動作させるエンドポイント・テストコードを示します。

Refresh Token を HttpOnly Cookie に格納するサービスメソッド

GraphQL Resolver におけるリフレッシュエンドポイント

e2e テストで認証フロー全体を検証

ポイント
- テストは GraphQL エンドポイント (/graphql) に対して HTTP リクエストを送信し、Cookie の受け渡しまで検証します。
- CI 環境でも同様に実行できるので、認証ロジックの回帰テストが容易になります。


まとめ

  • 環境構築:Node ≥ 18 と Nest CLI を用いれば数分で開発基盤が完成します。
  • GraphQL 設定:Code First/Schema First のどちらも @nestjs/graphql v12 でシームレスに利用可能です。autoSchemaFile はデフォルトでプロジェクトルートに schema.gql を生成し、パスを明示すれば任意の場所へ出力できます。
  • 認証基盤AuthModuleJwtModule とシンプルなインメモリ UserService を組み込み、JwtStrategy がトークン検証とユーザー取得を担います。
  • Guard の統合GqlAuthGuard が GraphQL コンテキストに user を注入し、Resolver は ctx.user で取得できるため HTTP と GraphQL の認証ロジックが統一されます。
  • ロールベース制御Roles デコレータと RolesGuard により、細かい権限チェックを簡潔に実装できます。
  • Refresh Token:HttpOnly Cookie で安全に保存し、リフレッシュエンドポイントと e2e テストで全体フローを検証可能です。

以上の手順通りに構築すれば、NestJS と GraphQL の組み合わせで スケーラブルかつテスト容易な JWT 認証システム が完成します。サンプルコードは GitHub のリポジトリでも公開中ですので、ぜひクローンして動作を確認し、自プロジェクトに合わせてカスタマイズしてください。

スポンサードリンク

-NestJS