nextjs-supabase-auth
Next.jsのApp RouterとSupabase Authを高度に統合するスキルです。認証フローの設計からセッション管理、ミドルウェア設定まで、実践的な実装をサポートします。
description の原文を見る
Expert integration of Supabase Auth with Next.js App Router
SKILL.md 本文
Next.js + Supabase Auth
Next.js App Router に対する Supabase Auth のエキスパート統合
Capabilities
- nextjs-auth
- supabase-auth-nextjs
- auth-middleware
- auth-callback
Prerequisites
- 必須スキル: nextjs-app-router, supabase-backend
Patterns
Supabase クライアントセットアップ
異なるコンテキスト用に適切に設定された Supabase クライアントを作成します
使用時期: Next.js プロジェクトで認証を設定する場合
// lib/supabase/client.ts (ブラウザクライアント)
'use client'
import { createBrowserClient } from '@supabase/ssr'
export function createClient() {
return createBrowserClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
}
// lib/supabase/server.ts (サーバークライアント)
import { createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'
export async function createClient() {
const cookieStore = await cookies()
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll()
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) => {
cookieStore.set(name, value, options)
})
},
},
}
)
}
認証ミドルウェア
ルートを保護し、ミドルウェアでセッションをリフレッシュします
使用時期: ルート保護またはセッションリフレッシュが必要な場合
// middleware.ts
import { createServerClient } from '@supabase/ssr'
import { NextResponse, type NextRequest } from 'next/server'
export async function middleware(request: NextRequest) {
let response = NextResponse.next({ request })
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return request.cookies.getAll()
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) => {
response.cookies.set(name, value, options)
})
},
},
}
)
// セッションが期限切れの場合はリフレッシュ
const { data: { user } } = await supabase.auth.getUser()
// ダッシュボードルートを保護
if (request.nextUrl.pathname.startsWith('/dashboard') && !user) {
return NextResponse.redirect(new URL('/login', request.url))
}
return response
}
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
}
認証コールバックルート
OAuth コールバックを処理し、コードをセッションと交換します
使用時期: OAuth プロバイダー (Google、GitHub など) を使用する場合
// app/auth/callback/route.ts
import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
export async function GET(request: Request) {
const { searchParams, origin } = new URL(request.url)
const code = searchParams.get('code')
const next = searchParams.get('next') ?? '/'
if (code) {
const supabase = await createClient()
const { error } = await supabase.auth.exchangeCodeForSession(code)
if (!error) {
return NextResponse.redirect(`${origin}${next}`)
}
}
return NextResponse.redirect(`${origin}/auth/error`)
}
サーバーアクション認証
Server Actions で認証操作を処理します
使用時期: Server Components からログイン、ログアウト、またはサインアップを行う場合
// app/actions/auth.ts
'use server'
import { createClient } from '@/lib/supabase/server'
import { redirect } from 'next/navigation'
import { revalidatePath } from 'next/cache'
export async function signIn(formData: FormData) {
const supabase = await createClient()
const { error } = await supabase.auth.signInWithPassword({
email: formData.get('email') as string,
password: formData.get('password') as string,
})
if (error) {
return { error: error.message }
}
revalidatePath('/', 'layout')
redirect('/dashboard')
}
export async function signOut() {
const supabase = await createClient()
await supabase.auth.signOut()
revalidatePath('/', 'layout')
redirect('/')
}
サーバーコンポーネントでユーザー情報を取得
Server Components で認証済みユーザーにアクセスします
使用時期: ユーザー固有のコンテンツをサーバー側でレンダリングする場合
// app/dashboard/page.tsx
import { createClient } from '@/lib/supabase/server'
import { redirect } from 'next/navigation'
export default async function DashboardPage() {
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) {
redirect('/login')
}
return (
<div>
<h1>Welcome, {user.email}</h1>
</div>
)
}
Validation Checks
getSession() を使用した認証チェック
重大度: ERROR
メッセージ: getSession() は JWT を検証しません。セキュリティ重要なチェックには getUser() を使用してください。
修正アクション: セキュリティ重要なチェックで getSession() を getUser() に置き換えてください
コールバックルートなしの OAuth
重大度: ERROR
メッセージ: OAuth を使用していますが、app/auth/callback/route.ts にコールバックルートがありません
修正アクション: OAuth リダイレクトを処理するために app/auth/callback/route.ts を作成してください
サーバーコンテキストでのブラウザクライアント
重大度: ERROR
メッセージ: サーバーコンテキストでブラウザクライアントが使用されています。代わりに createServerClient を使用してください。
修正アクション: @supabase/ssr から createServerClient をインポートして使用してください
ミドルウェアなしの保護ルート
重大度: WARNING
メッセージ: middleware.ts が見つかりません。ルート保護用にミドルウェアの追加を検討してください。
修正アクション: middleware.ts を作成してルートを保護し、セッションをリフレッシュしてください
ハードコードされた認証リダイレクト URL
重大度: WARNING
メッセージ: localhost リダイレクトがハードコードされています。環境の柔軟性を高めるために origin を使用してください。
修正アクション: window.location.origin または process.env.NEXT_PUBLIC_SITE_URL を使用してください
エラーハンドリングなしの認証呼び出し
重大度: WARNING
メッセージ: エラーハンドリングなしの認証操作です。常にエラーをチェックしてください。
修正アクション: { data, error } を分割代入して、エラーケースを処理してください
再検証なしの認証アクション
重大度: WARNING
メッセージ: 認証アクションに revalidatePath がありません。キャッシュが古い認証状態を表示する可能性があります。
修正アクション: 認証操作後に revalidatePath('/', 'layout') を追加してください
クライアント側のみのルート保護
重大度: WARNING
メッセージ: クライアント側のルート保護ではコンテンツがちらつきます。middleware を使用してください。
修正アクション: 保護を middleware.ts に移動してより良い UX を実現してください
Collaboration
委譲トリガー
- database|rls|queries|tables -> supabase-backend (認証がデータベースレイヤーを必要とする)
- route|page|component|layout -> nextjs-app-router (認証が Next.js パターンを必要とする)
- deploy|production|vercel -> vercel-deployment (認証がデプロイ設定を必要とする)
- ui|form|button|design -> frontend (認証が UI コンポーネントを必要とする)
完全な認証スタック
スキル: nextjs-supabase-auth, supabase-backend, nextjs-app-router, vercel-deployment
ワークフロー:
1. データベースセットアップ (supabase-backend)
2. 認証実装 (nextjs-supabase-auth)
3. ルート保護 (nextjs-app-router)
4. デプロイ設定 (vercel-deployment)
保護された SaaS
スキル: nextjs-supabase-auth, stripe-integration, supabase-backend
ワークフロー:
1. ユーザー認証 (nextjs-supabase-auth)
2. カスタマー同期 (stripe-integration)
3. サブスクリプションゲート (supabase-backend)
Related Skills
相性の良いスキル: nextjs-app-router, supabase-backend
When to Use
- ユーザーが言及または暗示: supabase auth next
- ユーザーが言及または暗示: authentication next.js
- ユーザーが言及または暗示: login supabase
- ユーザーが言及または暗示: auth middleware
- ユーザーが言及または暗示: protected route
- ユーザーが言及または暗示: auth callback
- ユーザーが言及または暗示: session management
Limitations
- 上記で説明されているスコープが明確に一致する場合にのみ、このスキルを使用してください。
- 出力を環境固有の検証、テスト、またはエキスパートレビューの代替として扱わないでください。
- 必要な入力、許可、安全境界、または成功基準が不足している場合は、停止して説明を求めてください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。