Communitygithub.com

Auth.js (NextAuth v5) 認証パターン

Auth.js (NextAuth v5) の認証パターン - 設定、プロバイダー、セッション戦略、ミドルウェア、データベースアダプター、ロールベースアクセス、Edge互換性

Auth.js (NextAuth v5) 認証パターン とは?

このスキルは、Auth.js(旧NextAuth v5)を使用してNext.jsアプリケーションに認証機能を実装するための包括的なパターン集です。ルートに`auth.ts`ファイルを配置し、`NextAuth()`から`{ auth, handlers, signIn, signOut }`をエクスポートする集中設定方式を採用します。`auth()`関数は、getServerSessionなどのv4の非推奨APIを置き換え、サーバーコンポーネント、ルートハンドラー、サーバーアクション、ミドルウェア全体で一貫したセッションアクセスを提供します。デフォルトのJWTセッション戦略はステートレスでデータベース不要ですが、データベースアダプターを使用して永続的なセッションを実現することもできます。このスキルはOAuthプロバイダー(GitHub、Googleなど)、資格情報プロバイダー、メール/マジックリンク認証、コールバックのカスタマイズ、ロールベースアクセス制御、Edgeランタイム互換性のための設定分割など、80以上のビルトインプロバイダーをカバーしています。特に、環境変数`AUTH_SECRET`の使用、`AUTH_`プレフィックス環境変数の自動検出、データベースセッション使用時のミドルウェア設定分割(auth.config.ts + auth.ts)など、v5の重要な要件を強制します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/agents-inc/skills/tree/HEAD/src/skills/api-auth-nextauth

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Auth.js (NextAuth v5) パターン

クイックガイド: ルートの auth.ts ファイルで Auth.js を設定し、NextAuth() から { auth, handlers, signIn, signOut } をエクスポートします。統一された auth() 関数をすべての場所(サーバーコンポーネント、ルートハンドラー、ミドルウェア)で使用します。デフォルトのセッション戦略は JWT(Cookieベース)です。永続的なセッションにはデータベースアダプターを追加します。ミドルウェアまたはページごとの auth() チェックでルートを保護します。


<critical_requirements>

重要: このスキルを使用する前に

すべてのコードは CLAUDE.md のプロジェクト規約に従わなければなりません(kebab-case、名前付きエクスポート、インポート順序、import type、名前付き定数)

(ルートの auth.ts ファイルで Auth.js を設定し、NextAuth() から { auth, handlers, signIn, signOut } をエクスポートする必要があります)

(サーバーサイドのセッションアクセスには、統一された auth() 関数を使用する必要があります - 非推奨の getServerSession()、getSession()、または getToken() は使用しないでください)

(環境変数 AUTH_SECRET を使用する必要があります - NEXTAUTH_SECRET は v5 で非推奨です)

(プロバイダーの認証情報には AUTH_ プレフィックスの環境変数を使用する必要があります(例:AUTH_GITHUB_ID、AUTH_GITHUB_SECRET) - これらは自動検出されます)

(データベースセッションをミドルウェアと併用する場合、認証設定を auth.config.ts(Edge互換)と auth.ts(アダプター付き)に分割する必要があります)

(サーバーアクションおよび API ルート内でセッションをチェックする必要があります - ミドルウェアだけでは認可に不十分です)

</critical_requirements>


自動検出: Auth.js、NextAuth、next-auth、authjs、auth.ts、auth.config.ts、NextAuth()、signIn、signOut、auth()、handlers、SessionProvider、useSession、AUTH_SECRET、OAuth プロバイダー、資格情報プロバイダー、データベースアダプター、@auth/prisma-adapter、@auth/drizzle-adapter、authorized コールバック、jwt コールバック、session コールバック、プロキシ認証、ミドルウェア認証

使用するタイミング:

  • Next.js、SvelteKit、Express、または Qwik アプリに認証を追加する場合
  • 80 以上のビルトインプロバイダーを使用した OAuth ログイン(GitHub、Google、Discord など)を実装する場合
  • 電子メール/マジックリンク認証フローを構築する場合
  • JWT またはデータベースバックアップのセッション管理が必要な場合
  • Edge互換のミドルウェア認証が必要なプロジェクト

使用すべきでないタイミング:

  • カスタム認証システムをゼロから構築する場合(Auth.js は意見が強く反映されています)
  • すぐに使えるきめ細かい組織/チーム管理が必要な場合
  • Web フロントエンドがないモバイル専用アプリ
  • プラグインアーキテクチャを持つセルフホスト認証が必要な場合

カバーされる主要パターン:

  • 認証設定(auth.ts、auth.config.ts)
  • OAuth プロバイダー(GitHub、Google、資格情報、メール)
  • セッション戦略(JWT vs データベース)
  • セッションアクセス(サーバーコンポーネント、ルートハンドラー、クライアントコンポーネント)
  • ミドルウェア/プロキシルート保護
  • データベースアダプター(Prisma、Drizzle)
  • コールバック(jwt、session、signIn、redirect)
  • ロールベースのアクセス制御
  • Edge互換性のための設定分割

詳細リソース:

  • 意思決定フレームワークとアンチパターンについては、reference.md を参照してください

コアパターン:


哲学

Auth.js (v5) は認証を 単一の統一 API に統合します。auth() 関数は、サーバーサイドで使用する場合、v4 の getServerSession、getSession、withAuth、getToken を置き換えます。useSession() は引き続き正しいクライアントサイド API です。設定は API ルートではなくルートファイルに配置されます。

基本原則:

  1. フレームワークに依存しない - Next.js、SvelteKit、Express、Qwik で動作
  2. 統一 API - すべてのサーバーサイドコンテキストで単一の auth() 関数
  3. プロバイダーエコシステム - AUTH_* 環境変数を自動検出する 80 以上のビルトイン OAuth プロバイダー
  4. デフォルトで JWT - 暗号化された Cookie によるステートレスセッション、データベース不要
  5. Edge 互換 - ミドルウェアは Edge ランタイムで実行(設定分割あり)(Next.js 16 プロキシは Node.js で実行)
  6. プログレッシブな複雑化 - OAuth から始めて、データベースアダプターを追加し、コールバックをカスタマイズ

コアパターン

パターン 1: 認証設定

中央設定ファイルは、NextAuth() から必要なすべてをエクスポートします。

基本的な OAuth 設定

// auth.ts
import NextAuth from "next-auth";
import GitHub from "next-auth/providers/github";
import Google from "next-auth/providers/google";

export const { auth, handlers, signIn, signOut } = NextAuth({
  providers: [
    GitHub, // AUTH_GITHUB_ID と AUTH_GITHUB_SECRET を自動検出
    Google, // AUTH_GOOGLE_ID, AUTH_GOOGLE_SECRET を自動検出
  ],
});
// app/api/auth/[...nextauth]/route.ts
import { handlers } from "@/auth";

export const { GET, POST } = handlers;

なぜ良いか: 単一の設定ファイルですべての認証ユーティリティをエクスポート、プロバイダーは AUTH_* 環境変数を自動検出、API ルートは最小限

環境変数

# .env.local
AUTH_SECRET="generate-with-npx-auth-secret"  # 必須
AUTH_GITHUB_ID="your-github-client-id"       # GitHub プロバイダーによって自動検出
AUTH_GITHUB_SECRET="your-github-secret"      # GitHub プロバイダーによって自動検出
AUTH_GOOGLE_ID="your-google-id"       # Google プロバイダーによって自動検出
AUTH_GOOGLE_SECRET="your-google-secret"

なぜ良いか: v5 では AUTH_ プレフィックスが標準化され、AUTH_SECRET は非推奨の NEXTAUTH_SECRET を置き換え、プロバイダーは認証情報を自動検出


パターン 2: プロバイダー

Auth.js は OAuth、電子メール/マジックリンク、および資格情報認証をサポートします。80 以上のビルトイン OAuth プロバイダーは AUTH_* 環境変数を自動検出します。

// OAuth: プロファイルマッピングをカスタマイズ
GitHub({
  profile(profile) {
    return {
      id: String(profile.id),
      name: profile.name ?? profile.login,
      role: "user",
    };
  },
});

// 資格情報: 入力を検証し、失敗した場合は null を返す
Credentials({
  async authorize(credentials) {
    const parsed = LoginSchema.safeParse(credentials);
    if (!parsed.success) return null;
    const user = await getUserByEmail(parsed.data.email);
    if (
      !user ||
      !(await verifyPassword(parsed.data.password, user.hashedPassword))
    )
      return null;
    return { id: user.id, name: user.name, email: user.email };
  },
});

重要なルール: DB ルックアップの前に入力を検証し、常にパスワードをハッシュ化し、失敗した場合は null を返します(絶対にスローしないでください - 情報漏洩につながります)。完全な実装については examples/core.md を参照してください。


パターン 3: コールバック

4 つのコールバックが認証動作をカスタマイズします。データフロー: jwt コールバック(トークンをエンリッチ) -> session コールバック(クライアントに公開)

callbacks: {
  jwt({ token, user }) {
    if (user) { token.id = user.id; token.role = user.role ?? "user"; }
    return token;
  },
  session({ session, token }) {
    session.user.id = token.id as string;
    session.user.role = token.role as string;
    return session;
  },
}

重要なルール: JWT コールバックはすべての auth() 呼び出し時に実行されます(軽量に保つこと)、user パラメーターはサインイン時にのみ存在し、OAuth トークンをクライアントに公開しないでください。signIn および redirect を含む完全なコールバック実装については examples/core.md を参照してください。


パターン 4: セッションアクセス

統一された auth() 関数は、サーバーサイドで使用する場合、v4 の getServerSession、getSession、getToken を置き換えます。useSession() はクライアントコンポーネントに残ります。

コンテキストセッションへのアクセス方法
サーバーコンポーネントconst session = await auth()
ルートハンドラーexport const GET = auth(function GET(req) { req.auth })
サーバーアクションconst session = await auth()
ミドルウェア/プロキシexport { auth as middleware } または authorized コールバック
クライアントコンポーネントuseSession()(レイアウトに SessionProvider が必要)

重要なルール: サーバーサイドのインポートは @/auth から、クライアントサイドのインポートは next-auth/react から行います。クライアントコンポーネントで auth() を呼び出さないでください。完全な実装については examples/session.md を参照してください。


パターン 5: サインイン / サインアウトアクション

2 つのアプローチ: サーバーアクション(推奨、プログレッシブエンハンスメント)またはクライアントサイド。

// サーバーサイド(推奨): @/auth からインポートし、フォーム内でサーバーアクションを使用
import { signIn, signOut } from "@/auth";
// フォームアクション内: await signIn("github", { redirectTo: "/dashboard" })
// フォームアクション内: await signOut({ redirectTo: "/" })

// クライアントサイド: next-auth/react からインポートし、onClick ハンドラーを使用
import { signIn, signOut } from "next-auth/react";
// onClick: signIn("github", { callbackUrl: "/dashboard" })

重要なルール: サーバーサイドは redirectTo を使用し、クライアントサイドは callbackUrl を使用します。signIn() は内部で NEXT_REDIRECT 例外をスローします。戻り値を期待して try/catch でラップしないでください。完全な実装については examples/core.md を参照してください。


パターン 6: TypeScript 拡張

types/next-auth.d.ts で宣言マージを使用して、セッションと JWT の型を拡張します。Session、User、JWT インターフェースにカスタムフィールド(例:id、role)を宣言し、& DefaultSession["user"] を使用してデフォルトを保持します。完全な型宣言の例については examples/core.md を参照してください。


統合ガイド

Auth.js は認証レイヤーです。 本人確認、セッション管理、ルート保護を処理します。認可ロジック(ロールチェック、権限システム)は処理しません - それはアプリケーションコードです。

フレームワークサポート: Auth.js は、フレームワーク固有のパッケージ(next-auth、@auth/sveltekit、@auth/express)を介して複数の Web フレームワークで動作します。

データベースアダプター: データベースセッションの場合、Auth.js は ORM と統合するアダプターパッケージ(@auth/prisma-adapter、@auth/drizzle-adapter など)を提供します。examples/database.md を参照してください。

セッション戦略はニーズによって異なります:

  • JWT(デフォルト) - データベース不要、Edge で動作、ステートレス
  • データベース - アダプターが必要、サーバーサイドのセッションストア、即時無効化をサポート

Auth.js が処理しないもの: きめ細かい認可/RBAC、レート制限、または認証以外のデータベースクエリ - これらはアプリケーションレベルの関心事です。


<red_flags>

レッドフラグ

  • getServerSession(authOptions) の使用 -- v5 で非推奨。auth.ts から auth() を使用してください
  • NEXTAUTH_SECRET または NEXTAUTH_URL の使用 -- 非推奨。AUTH_SECRET を使用してください(URL は自動検出されます)
  • レート制限なしの資格情報プロバイダー -- ブルートフォース攻撃に対して脆弱
  • セッションコールバックを介した OAuth トークンのクライアントへの公開 -- accessToken/refreshToken はサーバーサイドのみに保持
  • 唯一の認可としてのミドルウェア/プロキシ -- レンダリング前に実行されますが、サーバーアクション/API ルートでのルートごとのチェックを置き換えるわけではありません
  • ミドルウェアでのデータベースアダプターのインポート -- データベース ORM は Edge ランタイムでは実行できません(Next.js 14/15)。設定を auth.config.ts + auth.ts に分割してください
  • signIn() を try/catch でラップする -- 内部で NEXT_REDIRECT 例外をスローします(これは意図的です)
  • JWT コールバックが呼び出しごとにデータベースにクエリを実行する -- すべての auth() 呼び出しで実行されます。軽量に保ってください

完全なアンチパターンリスト、注意点、移行テーブルについては reference.md を参照してください。

</red_flags>


<critical_reminders>

重要な注意点

すべてのコードは CLAUDE.md のプロジェクト規約に従わなければなりません

(ルートの auth.ts ファイルで Auth.js を設定し、NextAuth() から { auth, handlers, signIn, signOut } をエクスポートする必要があります)

(サーバーサイドのセッションアクセスには、統一された auth() 関数を使用する必要があります - 非推奨の getServerSession()、getSession()、または getToken() は使用しないでください)

(環境変数 AUTH_SECRET を使用する必要があります - NEXTAUTH_SECRET は v5 で非推奨です)

(プロバイダーの認証情報には AUTH_ プレフィックスの環境変数を使用する必要があります(例:AUTH_GITHUB_ID、AUTH_GITHUB_SECRET) - これらは自動検出されます)

(データベースセッションをミドルウェアと併用する場合、認証設定を auth.config.ts(Edge互換)と auth.ts(アダプター付き)に分割する必要があります)

(サーバーアクションおよび API ルート内でセッションをチェックする必要があります - ミドルウェアだけでは認可に不十分です)

これらのルールに従わないと、認証の失敗、非推奨パターンの公開、またはセキュリティの脆弱性が発生します。

</critical_reminders>

Individual skills in this repo

This repo contains 11 individual skills — each has its own dedicated page.

関連スキル