NestJS

NestJS GraphQL 認証実装: Code FirstとFirebaseの最新手法

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

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

NestJS GraphQL 認証 実装 手順:Code Firstアプローチで最新パターンを実現する

GraphQL APIの認証構築に悩む開発者向けに、NestJSとFirebase Authenticationを組み合わせたJWT認証フローの実装手順を解説します。現在の技術動向(2023年時点)に基づき、Code Firstアプローチ×Passport戦略×Firebase連携のパターンを体系的に紹介し、プロジェクトへの適用がスムーズになるよう設計しています。


NestJSとGraphQLのプロジェクト初期設定

NestJSでGraphQLサーバーを開発する際には、最初にプロジェクト構成とモジュール導入を確実に行う必要があります。Code Firstアプローチでは、TypeScriptの型定義がGraphQLスキーマに自動変換されるため、開発効率が高まります。

NestJS CLIによるプロジェクト作成

NestJS CLIを使用してプロジェクトを生成し、GraphQLモジュール導入を選択します。

  1. NestJS CLIでプロジェクト生成
    bash
    npm i -g @nestjs/cli
    nest new graphql-auth-demo

  2. 必要ライブラリのインストール
    GraphQLサーバー構築に必要なモジュールを導入します。
    bash
    npm install @nestjs/graphql graphql-tools apollo-server-express


Code First vs Schema Firstの選定基準

GraphQL API設計において、Code FirstとSchema Firstの選択は開発スタイルやチーム規模に大きく影響します。それぞれの特徴を比較し、プロジェクト要件に合った方法を選定してください。

項目 Code First Schema First
定義方式 TypeScriptで型定義(@InputType, @ObjectType GraphQLスキーマファイル(.graphql
開発効率 (TypeScriptコードと同期) 中〜低(別途スキーマ管理必要)
ツール連携 Prismaなどと連携しやすい 限定的
おすすめ対象 型駆動開発を重視するプロジェクト GraphQL独自のスキーマ設計が必要な場合

Code Firstは、TypeScriptとの親和性が高く、GraphQLスキーマと型定義の不一致を防げます。


JWT認証フローの構築(Passport・AuthGuard)

JWT認証では、Passport戦略によるトークン検証AuthGuardでリクエストフィルタリングを行います。以下に手順を示します。

Passport戦略のカスタマイズ手順

  1. Passport-JWTモジュール導入
    bash
    npm install passport-jwt @nestjs/passport

  2. JWT戦略の定義
    パスワード認証用にJwtStrategyクラスを作成し、以下のように実装します。

typescript
import { Strategy } from 'passport-jwt';
import { ExtractJwt } from 'passport-jwt';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: process.env.JWT_SECRET, // 環境変数からシークレット読み込み
});
}

}

  1. AuthGuardの使用
    リゾルバに@UseGuards(JwtAuthGuard)を追加することで、認証チェックが自動で実行されます。

Firebase Authenticationとの連携

Firebase Authenticationは、フロントエンドでのトークン取得バックエンドでの検証を組み合わせた柔軟な認証フローを提供します。以下の手順で導入できます。

Firebase SDKの導入手順

  1. Firebase Admin SDKインストール
    bash
    npm install firebase-admin

  2. Firebase初期化設定
    firebaseConfig.tsファイルにプロジェクト情報を配置し、初期化します。

typescript
import * as admin from 'firebase-admin';

const serviceAccount = require('./path/to/service-account.json');

admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});

  1. IDトークンの検証処理
    パスワード認証と同様に、FirebaseAuthGuardを作成し、以下のように検証ロジックを実装します。

typescript
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class FirebaseAuthGuard extends AuthGuard('firebase') {
// 特にオーバーライド不要
}

Firebase Authenticationを使うことで、セキュリティリスクを最小限に抑えつつ、フロントエンドの認証フローを柔軟に設計できます。


GraphQLエンドポイントの認証保護

GraphQL APIでは、ResolverレベルとSchemaレベルでのアクセス制御を組み合わせることで、細粒度なセキュリティを実現します。

Resolverレベルでのアクセス制御

  1. AuthGuardデコレータの使用
    リゾルバに@UseGuards(JwtAuthGuard)@UseGuards(FirebaseAuthGuard)を付与することで、認証が必要なエンドポイントを指定できます。

typescript
@Resolver()
export class UserResolver {
@Query()
@UseGuards(JwtAuthGuard)
getUser(@Args('id') id: string): Promise<User> {
return this.userService.findOne(id);
}
}

  1. Roleベースのアクセス制御(RBAC)
    ユーザー権限をチェックするには、@Roles()デコレータとカスタムガードで実装します。

Schemaレベルでの制御(例:Field Directive)

Schemaレベルでは、GraphQLスキーマに独自のDirectiveを定義し、特定のフィールドへのアクセスを制限できます。

  • @auth directiveを使って、isAuthenticatedなどの条件を適用。
  • @role(role: "admin")のようにロールベースでフィールドを保護。

トークン検証ロジックのカスタマイズ

JWTトークンをより柔軟に扱うには、ペイロードの拡張検証フックのカスタマイズが効果的です。以下に具体的な例を示します。

ペイロードの拡張方法

  1. 独自フィールドの追加
    payloadオブジェクトに任意のフィールド(例: role, tenantId)を含めます。

typescript
{
userId: '123',
username: 'hoge',
role: 'admin'
}

  1. セキュリティ強化
    検証時にペイロードの有効性を確認する関数を実装します。

typescript
validate(payload: any) {
if (!payload.role || !['user', 'admin'].includes(payload.role)) {
throw new UnauthorizedException('不正なロール');
}
return payload;
}


FirebaseAuthGuardの検証ロジック改善例

Firebaseトークンをより正確に検証するには、FirebaseStrategyをカスタマイズし、以下のように実装します。


結論と今後の展望

本記事では、NestJS GraphQL APIにおける認証フローの実装手順を以下の6ステップで解説しました。

  • プロジェクト初期設定:CLIとモジュール導入
  • Code First/SF選定:開発スタイルに応じたアプローチの選択
  • JWT認証構築:Passport戦略でトークン検証を実装
  • Firebase連携:フロントとバックエンドでの安全な認証フロー設計
  • GraphQL保護:ResolverとSchemaレベルのアクセス制御
  • トークンカスタマイズ:ペイロード拡張と検証フックの追加

実際のプロジェクトに応じて、柔軟にこれらの手法を組み合わせることで、信頼性の高いGraphQL APIを構築できます。実装中に詰まるポイントがあればコメント欄で質問してください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-NestJS