authentication について
authenticationは、NextAuth.jsを使うNext.jsプロジェクト向けに認証と認可のパターンを示すスキルです。セッション確認、ロール検証、ルート保護、安全なトークン管理の方法を扱います。
主な機能
- 01auth()による現在のセッション取得
- 02管理操作時のユーザーロール確認
- 03ミドルウェアによるルート保護
- 04トークン保存にlocalStorageではなくhttpOnly Cookieを使用
- 05APIルートでJWTを検証
活用シーン
- 01APIルートでログイン済みセッションを必須にする
- 02ユーザーロールに応じて管理操作を制限
- 03ミドルウェアでルートを保護
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ santiagoxor/ pintureria-digital --skill authenticationインストール後、Claude Code で/authenticationを入力して読み込まれたか確認します。
詳細
認証
クイックスタート
認証を扱う際は、次の点に注意してください。
- 現在のセッションを取得するには、
@/lib/authのauth()を使用します - 管理者向けの操作を行う前に、ロールを確認します
- ルートを保護するには、ミドルウェアを使用します
- トークンを localStorage に保存しないでください(httpOnly Cookie を使用してください)
- 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;
}
コメント
Markdown 対応