コンテンツにスキップ

UI for Admin — ディレクトリ構成

レイヤー構成

app/                                  # Next.js App Router
  (auth)/                             # 公開ページ: login, forgot-password, reset-password
  (authenticated)/                    # 保護レイアウト: /auth/me をサーバーコンポーネントで取得しロールガード
    admins/
    organizations/
    projects/
    users/
  api/                                # Next.js Route Handler(ステートレスプロキシ)
    auth/
      login/route.ts
      logout/route.ts
      forgot-password/route.ts
      reset-password/route.ts
    proxy/[...path]/route.ts          # 汎用 Bearer 付与プロキシ → 管理者 API
src/
  api/
    generated/                        # Orval 出力(型、フック、Zod)— 手動編集禁止
    validators/                       # 生成 Zod に対するハンドオーサリングの refinement
    client.ts                         # Orval フェッチャー(同一オリジン /api/proxy に向ける)
  auth/
    session.ts                        # Cookie read/write ヘルパー(server-only)
    guards.ts                         # can(flag, level) ヘルパー
  components/                         # shadcn + アプリ固有
  lib/
middleware.ts                         # エッジでの Cookie 存在チェック → /login リダイレクト
orval.config.ts

リクエストフロー

ブラウザ  ──►  Next.js Route Handler (/api/proxy/*)  ──►  管理者 API /api/v1/*
               ▲
               └─ httpOnly Cookie を読み Authorization: Bearer を付与

ブラウザから管理者 API への直接通信は行わない。すべて Next.js の同一オリジンプロキシ経由。


水平スケール

Next.js プロキシは完全にステートレス。任意のポッドが任意のリクエストを処理でき、スティッキーセッションや共有セッションストアは不要。ポッド間で共有する必要があるのは Cookie 署名シークレット(AWS Secrets Manager / Amplify の環境変数)のみ。

実際のセッション状態は水平共有済みのシステムに存在:

  • Cognito — JWT 自体(JWKS で自己検証)
  • PostgreSQL session テーブル — 管理者 API が参照するサーバーサイドセッション行
  • ブラウザ — Cookie