Community程式設計與開發github.com

Breadstick-Crumbs/add-auth

在專案中加入電子郵件與密碼驗證功能(註冊、登入、登出、工作階段、角色、變更密碼、忘記/重設密碼),使用經過測試的模板而非從頭撰寫。當使用者要求在 FastAPI、Next.js 或 Node 後端加入驗證、登入、註冊、帳戶、工作階段、受保護路由或密碼重設時使用。

add-auth 是什麼?

這個技能讓開發者能夠快速將完整的電子郵件與密碼驗證系統整合到專案中,支援 FastAPI、Next.js 和 Node.js 等多種技術棧。它提供經過安全測試的模板,包含註冊、登入、登出、工作階段管理、角色權限、變更密碼和忘記/重設密碼等功能。使用者無需從頭撰寫驗證邏輯,只需複製模板並調整邊緣設定(如資料庫連線、匯入、UI)即可。技能會自動偵測專案的技術棧與現有驗證狀態,並引導使用者完成模板複製、環境變數設定、資料庫遷移與測試執行,確保整合過程順暢且安全。

相容平台~Claude Code~Codex CLI~Cursor
Part ofNext.js
npx skills add https://github.com/Breadstick-Crumbs/add-auth/tree/HEAD/skills/add-auth

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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 – 無框架核心(雜湊、存取與重設權杖、Cookie 選項),附有 core.test.ts。
  • templates/nextjs/ – 基於上述核心的 Next.js App Router 層:lib/auth/{schema,users,session,email}.ts、app/(auth)/actions.ts、proxy.ts。

1. 複製前先檢查

找出以下資訊,並用一兩行告訴使用者:

  • 技術棧: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. 複製並連接

使用插件的腳本進行複製,不要透過讀取和重新撰寫檔案:腳本會原樣複製檔案且不消耗 Token。腳本位於此技能基礎目錄上兩層的 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 伺服器

如果任何目標檔案已存在,腳本會拒絕覆寫且不複製任何內容。當衝突的檔案是需要合併的檔案(現有的 proxy.ts 或 middleware.ts)時,請使用 --keep-existing 重新執行,這會複製其餘檔案,然後手動合併。僅在使用者同意遺失該檔案後才使用 --force。如果無法使用 node,請手動複製相同檔案(使用 cp),且仍然不要重新輸入它們。

複製後,僅更改下方步驟中指定的內容。保留 security.py、core.ts 和路由中的邏輯不變。

FastAPI

  1. 使用 install.mjs fastapi <package-dir> --tests <tests-dir> 複製(例如 app/auth/)。
  2. 編輯 auth/db.py,讓 get_session 成為專案現有的工作階段依賴項。這是驗證功能唯一觸及資料庫設定的地方。
  3. 如果專案使用純 SQLAlchemy 而非 SQLModel,請將 models.py 中的 User 重寫為具有相同欄位的 SQLAlchemy 模型,並保留 Pydantic 架構。
  4. 在應用程式的主檔案中執行 app.include_router(auth_router)。
  5. 使用 user: CurrentUser 或 dependencies=[Depends(require_role("admin"))] 保護路由。
  6. 新增依賴項:pyjwt、pwdlib[argon2,bcrypt]、email-validator、python-multipart、sqlmodel(如果尚未存在)。
  7. 透過專案的遷移機制建立 users 資料表(如果專案有 Alembic,則使用 Alembic 自動產生)。
  8. 修正已複製的 test_auth.py 中的匯入路徑,使其符合套件路徑(例如 from auth 變為 from app.auth),然後執行測試。

Next.js(App Router)

  1. 使用 install.mjs nextjs <app-root> 複製:核心及其測試、lib/auth/*、app/(auth)/actions.ts 和 proxy.ts。
  2. Next.js 15 或更早版本:將 proxy.ts 重新命名為 middleware.ts,並將其匯出名稱改為 middleware。如果專案已有中介軟體/代理檔案,請將驗證檢查合併到其中。
  3. 將 lib/auth/users.ts 指向專案的資料庫:變更 db 匯入,或為 Prisma/純 SQL 重新撰寫其五個函式。將 schema.ts 合併到現有的 Drizzle 架構中,並產生遷移。
  4. 在代理程式中將 PROTECTED 設定為應用程式的私有路徑。
  5. 使用專案自己的元件和樣式建立 /sign-in、/sign-up、/forgot-password 和 /reset-password 頁面。每個頁面都是一個表單,透過 useActionState 將資料提交到對應的伺服器動作;在登入頁面將 next 作為隱藏欄位傳遞,在重設頁面則傳遞 token 查詢參數。
  6. 在伺服器元件和動作中,使用 lib/auth/session.ts 中的 getUser() 或 requireUser("admin")。
  7. 依賴項: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 cookie(使用 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. 驗證功能正常

執行已複製的測試以及專案自己的檢查(測試、型別檢查、Lint、建置)。報告失敗情況及其輸出。然後說明使用者仍需自行完成的事項,通常是:在正式環境中設定 AUTH_SECRET、設定電子郵件、在真實資料庫上執行遷移。

規則

  • 保留:Argon2/bcrypt 雜湊、針對未知電子郵件的虛擬雜湊檢查、針對未知帳戶的相同回覆、與密碼雜湊綁定的重設權杖、權杖上的 purpose 檢查、httpOnly SameSite=Lax cookie、重新導向時的 safeNext。
  • 不要將權杖存放在 localStorage 中,不要記錄密碼或權杖,不要為驗證路由放寬 CORS。
  • 登入速率限制不在模板中。如果專案有速率限制器,請將登入和忘記密碼路由置於其後;如果沒有,請提及這一點。
  • 工作階段是簽署的權杖,因此登出只會結束該瀏覽器中的工作階段,但複製的權杖在過期前仍然有效。如果使用者需要「全部登出」,請新增 token_version 欄位,並在權杖讀取器中檢查它。

相關技能