mcpField
A
authentication

authentication

github.com/santiagoxorセキュリティ35 回インストール
リポジトリ

authentication について

authenticationは、NextAuth.jsを使うNext.jsプロジェクト向けに認証と認可のパターンを示すスキルです。セッション確認、ロール検証、ルート保護、安全なトークン管理の方法を扱います。

主な機能

  1. 01auth()による現在のセッション取得
  2. 02管理操作時のユーザーロール確認
  3. 03ミドルウェアによるルート保護
  4. 04トークン保存にlocalStorageではなくhttpOnly Cookieを使用
  5. 05APIルートでJWTを検証

活用シーン

  1. 01APIルートでログイン済みセッションを必須にする
  2. 02ユーザーロールに応じて管理操作を制限
  3. 03ミドルウェアでルートを保護

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/santiagoxor/pintureria-digital --skill authentication

インストール後、Claude Code で/authenticationを入力して読み込まれたか確認します。

詳細

認証

クイックスタート

認証を扱う際は、次の点に注意してください。

  1. 現在のセッションを取得するには、@/lib/auth の auth() を使用します
  2. 管理者向けの操作を行う前に、ロールを確認します
  3. ルートを保護するには、ミドルウェアを使用します
  4. トークンを localStorage に保存しないでください(httpOnly Cookie を使用してください)
  5. API ルートで JWT トークンを検証します

主なファイル

  • auth.ts - NextAuth.js の設定
  • src/lib/auth/ - 認証ユーティリティ
  • middleware.ts - ルート保護
  • src/app/api/auth/ - 認証 API ルート

よく使うパターン

現在のセッションを取得
import { auth } from '@/lib/auth';

export async function GET(request: NextRequest) {
  const session = await auth();
  
  if (!session) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }
  
  return NextResponse.json({ user: session.user });
}
管理者ロールを確認
const session = await auth();

if (session?.user?.role !== 'admin') {
  return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
}
保護された API ルート
import { auth } from '@/lib/auth';
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  // 1. Check authentication
  const session = await auth();
  if (!session) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }
  
  // 2. Check authorization (if needed)
  if (session.user.role !== 'admin') {
    return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
  }
  
  // 3. Process request
  const body = await request.json();
  // ... business logic
}
ミドルウェアによる保護
// middleware.ts
import { auth } from '@/lib/auth';
import { NextResponse } from 'next/server';

export async function middleware(request: NextRequest) {
  const session = await auth();
  
  // Protect admin routes
  if (request.nextUrl.pathname.startsWith('/admin')) {
    if (!session || session.user.role !== 'admin') {
      return NextResponse.redirect(new URL('/login', request.url));
    }
  }
  
  return NextResponse.next();
}
サインイン/サインアウト
import { signIn, signOut } from '@/lib/auth';

// Sign in
await signIn('google', {
  callbackUrl: '/dashboard',
});

// Sign out
await signOut({
  callbackUrl: '/',
});

ユーザーロール

  • admin - すべてのアクセス権
  • customer - 一般ユーザー
  • moderator - 限定的な管理者アクセス権

セッション構造

interface Session {
  user: {
    id: string;
    email: string;
    name?: string;
    role: 'admin' | 'customer' | 'moderator';
    image?: string;
  };
  expires: string;
}

コメント