add-auth は何をしますか?
このプラグインに含まれるテスト済みの認証テンプレートをユーザーのプロジェクトにコピーし、配線します。認証をゼロから書かず、テンプレート内のセキュリティロジックも変更しないでください。エッジ部分(データベースアクセス、インポート、UI)のみをアダプトします。
テンプレートは <skill-dir>/../../templates/ にあります(<skill-dir> はこのスキルのベースディレクトリです)。
templates/fastapi/auth/– FastAPIパッケージ:config.py,security.py,models.py,db.py,deps.py,routes.py,email.py; テストはtemplates/fastapi/tests/test_auth.py。templates/node/lib/auth/core.ts– フレームワークに依存しないコア(ハッシュ化、アクセストークン、リセットトークン、クッキーオプション)とcore.test.ts。templates/nextjs/– Next.js App Routerレイヤー(コア上に構築):lib/auth/{schema,users,session,email}.ts,app/(auth)/actions.ts,proxy.ts。
1. コピー前の確認
以下の項目を確認し、1~2行でユーザーに伝えてください。
- スタック: FastAPI(
pyproject/requirementsでfastapiを探す)、Next.js(package.jsonでnext)、またはその他のNodeサーバー(Express、Hono、Fastify、プレーンなhttp)。 - データベースレイヤー: SQLModel/SQLAlchemy、Drizzle、Prisma、または生のSQL。また、セッションや
dbオブジェクトがどこにあるか。 - 既存の認証:
usersテーブル、ログインルート、JWTライブラリ、認証プロバイダー(Clerk、Supabase、Auth.js)。認証が既に存在する場合は停止し、置き換えるか拡張するか尋ねてください。 - プロジェクトにデータが入った
usersテーブルが既にあるかどうか。ある場合は、2つ目のテーブルを作成する代わりに、テンプレートのカラムをマイグレーションでマッピングします。
2. コピーと配線
ファイルを読み取って書き換えるのではなく、プラグインのスクリプトでコピーします。スクリプトはファイルを正確にコピーし、トークンを消費しません。スクリプトはこのスキルのベースディレクトリから2階層上の scripts/install.mjs です(<skill-dir>/../../scripts/install.mjs)。最初に --dry-run でプロジェクトルートから実行し、その後実際に実行します。
node <skill-dir>/../../scripts/install.mjs fastapi app --tests tests # app/auth/*.py, tests/test_auth.py
node <skill-dir>/../../scripts/install.mjs nextjs . # または src/(@/ エイリアスがそこを指している場合)
node <skill-dir>/../../scripts/install.mjs node src/auth # コアのみ、その他のNodeサーバー用
このスクリプトは上書きを拒否し、ターゲットファイルが1つでも存在する場合は何もコピーしません。競合がマージが必要なファイル(既存の proxy.ts や middleware.ts)の場合は、--keep-existing を付けて再実行し、残りをコピーしてから手動でマージします。--force はユーザーがファイルを失うことに同意した場合のみ使用します。node が利用できない場合は、同じファイルを手動で(cp で)コピーし、それでも再入力はしないでください。
コピー後は、以下の手順で指定された箇所のみを変更します。security.py、core.ts、ルートのロジックは変更しないでください。
FastAPI
install.mjs fastapi <package-dir> --tests <tests-dir>でコピーします(例:app/auth/)。auth/db.pyを編集し、get_sessionがプロジェクトの既存のセッション依存関係になるようにします。これが認証がデータベースセットアップに触れる唯一の場所です。- プロジェクトがSQLModelではなくプレーンなSQLAlchemyを使用している場合、
models.pyのUserを同じカラムを持つSQLAlchemyモデルに書き換え、Pydanticスキーマは維持します。 - アプリのメインファイルで
app.include_router(auth_router)を実行します。 - ルートを
user: CurrentUserまたはdependencies=[Depends(require_role("admin"))]で保護します。 - 依存関係を追加します:
pyjwt、pwdlib[argon2,bcrypt]、email-validator、python-multipart、sqlmodel(まだない場合)。 - プロジェクトのマイグレーション(Alembicがある場合はAlembic自動生成)を通じて
usersテーブルを作成します。 - コピーした
test_auth.pyのインポートをパッケージパスに修正し(from authからfrom app.authなど)、実行します。
Next.js(App Router)
install.mjs nextjs <app-root>でコピーします:コアとそのテスト、lib/auth/*、app/(auth)/actions.ts、proxy.ts。- Next.js 15以前の場合:
proxy.tsをmiddleware.tsにリネームし、そのエクスポートをmiddlewareにします。プロジェクトに既存のミドルウェア/プロキシファイルがある場合は、認証チェックをそれにマージします。 lib/auth/users.tsをプロジェクトのデータベースに向けます:dbインポートを変更するか、Prisma/生のSQL用に5つの関数を書き換えます。schema.tsを既存のDrizzleスキーマにマージし、マイグレーションを生成します。- プロキシ内の
PROTECTEDをアプリのプライベートパスに設定します。 - プロジェクトのコンポーネントとスタイリングを使用して、
/sign-in、/sign-up、/forgot-password、/reset-passwordページを構築します。各ページは、useActionStateを通じて対応するサーバーアクションにPOSTするフォームです。サインイン時にはnextを隠しフィールドとして渡し、リセット時にはtoken検索パラメータを渡します。 - サーバーコンポーネントとアクションでは、
lib/auth/session.tsのgetUser()またはrequireUser("admin")を使用します。 - 依存関係:
jose、bcryptjs、zod、server-only(Drizzleファイルをそのまま使用する場合はdrizzle-ormも)。
その他のNodeサーバー(Express、Hono、Fastify、プレーンなhttp)
コアのみを install.mjs node <dir> でコピーします。ルートはプロジェクトのスタイルで記述し、templates/nextjs/app/(auth)/actions.ts と同じ動作を維持します:
登録、ログイン(不明なメールと間違ったパスワードで同じエラーを返し、ユーザーが見つからなくても verifyPassword を呼び出す)、ログアウト、自分自身の情報取得、パスワード変更、パスワード忘れ(アカウントの有無に関わらず同じ応答)、パスワードリセット(readResetToken をユーザーの現在のハッシュで使用)。トークンは session クッキー(cookieOptions() で設定)または Authorization: Bearer ヘッダーから読み取ります。requireUser/requireRole ミドルウェアを追加します。
3. 環境設定
.env.example(コミットされた .env には決して追加しない)に以下を追加します:
AUTH_SECRET– 最低32文字のランダムな文字列。node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"でユーザーのローカル.env用に生成します。チャットで表示しないでください。AUTH_ACCESS_TOKEN_MINUTES(デフォルト7日)、AUTH_RESET_TOKEN_MINUTES(デフォルト60分)。- FastAPI:
FRONTEND_URL、およびリセットメール用にSMTP_HOST、SMTP_PORT、SMTP_USER、SMTP_PASSWORD、EMAIL_FROM。Next.js:APP_URL、次にlib/auth/email.tsの本文をプロジェクトのメールプロバイダーに置き換えます。 メールが設定されていない場合、リセットリンクはログに出力されます。これはローカル開発では問題ありません。
4. 動作確認
コピーしたテストとプロジェクト自身のチェック(テスト、型チェック、リンター、ビルド)を実行します。失敗があればその出力を報告します。その後、ユーザーが自分で行う必要があることを伝えます。通常は、本番環境で AUTH_SECRET を設定する、メールを設定する、実際のデータベースでマイグレーションを実行する、などです。
ルール
- 以下を維持すること:Argon2/bcryptハッシュ化、不明なメールに対するダミーハッシュチェック、不明なアカウントに対する同一の応答、パスワードハッシュに紐付いたリセットトークン、トークンの
purposeチェック、httpOnly SameSite=Lax クッキー、リダイレクト時のsafeNext。 - トークンをlocalStorageに保存しない、パスワードやトークンをログに記録しない、認証ルートのCORSを緩和しない。
- ログインレート制限はテンプレートに含まれていません。プロジェクトにレートリミッターがある場合は、ログインとパスワード忘れルートをその背後に配置します。ない場合は、そのことを言及します。
- セッションは署名付きトークンであるため、サインアウトはそのブラウザでのセッションを終了しますが、コピーされたトークンは期限が切れるまで有効です。「すべての端末からサインアウト」が必要な場合は、
token_versionカラムを追加し、トークンリーダーでそれをチェックします。