安全与风控
在 TypeScript/JavaScript 项目中用…
适用于 TypeScript/JavaScript 新项目或现有项目,需要用 Better Auth 快速搭建认证体系,包括邮箱密码、OAuth、插件、会话和认证页面的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 TypeScript/JavaScr特定
解决思路
- 写任何代码前先收集需求:扫描项目并向用户提问结构化问题,确保实现匹配需求。
- 扫描项目自动检测框架:查找 next.config、svelte.config、nuxt.config、astro.config、vite.config 或 Express/Hono 入口文件。
- 扫描数据库/ORM:查找 prisma/schema.prisma、drizzle.config.ts、package.json 依赖 pg、postgres、@neondatabase/serverless、mysql2、better-sqlite3、mongoose、mongodb。
- 如果存在 drizzle.config.ts,读取其 dialect 字段判断数据库类型,例如 postgresql → Drizzle + Postgres;并检查已安装的 Drizzle 驱动:drizzle-orm/node-postgres → pg,drizzle-orm/postgres-js → postgres,drizzle-orm/neon-http → Neon。
- 扫描现有认证:在 package.json 或 import 中查找 next-auth、lucia、clerk、supabase/auth、firebase/auth。
- 检测包管理器:查找 pnpm-lock.yaml、yarn.lock、bun.lockb 或 package-lock.json。
- 用扫描结果预填默认值,并跳过已经能回答的问题。
- 使用 AskQuestion 工具在单次调用中询问所有适用问题,跳过已从扫描中确定答案的问题,分组标题可用 'Auth Setup Planning'。
- 询问项目类型(未检测到时):New project from scratch | Adding auth to existing project | Migrating from another auth library。
- 询问框架(未检测到时):Next.js (App Router) | Next.js (Pages Router) | SvelteKit | Nuxt | Astro | Express | Hono | SolidStart | Other。
- 询问数据库与 ORM(未检测到时):PostgreSQL (Prisma) | PostgreSQL (Drizzle) | PostgreSQL (pg driver) | MySQL (Prisma) | MySQL (Drizzle) | MySQL (mysql2 driver) | SQLite (Prisma) | SQLite (Drizzle) | SQLite (better-sqlite3 driver) | MongoDB (Mongoose) | MongoDB (native driver)。
- 询问认证方式,总是问并允许多选:Email & password | Social OAuth(Google、GitHub 等)| Magic link(无密码邮件)| Passkey (WebAuthn) | Phone number。
- 如果选择了 Social OAuth,则后续询问需要哪些社交提供商,允许多选:Google | GitHub | Apple | Microsoft | Discord | Twitter/X。
- 如果选择了 Email & password,则后续询问是否要求邮箱验证:Yes | No。
- 如果邮箱验证为 Yes,或在 features 中选择了 Password reset,则后续询问如何发送邮件:Resend | Mock it for now (console.log)。
- 询问功能与插件,总是问并允许多选:Two-factor authentication (2FA) | Organizations / teams | Admin dashboard | API bearer tokens | Password reset | None of these。
- 询问认证页面,总是问并允许多选,并根据先前答案预选:始终可选 Sign in | Sign up;如果选了 Email & password 则可选 Forgot password | Reset password;如果启用邮箱验证则可选 Email verification。
- 询问认证 UI 风格,总是问:Minimal & clean | Centered card with background | Split layout(form + hero image)| Floating / glassmorphism | Other(用户自行描述)。
- 收集答案后,用 markdown 清单呈现简洁实现计划,示例包含框架、数据库、认证方式、插件、UI。
- 计划步骤应列出:安装 better-auth(CLI 以 auth 包发布,通过 npx auth@latest 运行,无需安装)。
- 计划步骤应列出:创建 lib/auth.ts 服务端配置。
- 计划步骤应列出:创建 lib/auth-client.ts React 客户端。
- 计划步骤应列出:在 app/api/auth/[...all]/route.ts 设置路由处理器。
- 计划步骤应列出:配置 Prisma adapter 并生成 schema。
- 计划步骤应列出:添加 Google & GitHub OAuth providers。
- 计划步骤应列出:启用 twoFactor 和 organization 插件。
- 计划步骤应列出:设置邮箱验证处理器。
- 计划步骤应列出:运行迁移。
- 计划步骤应列出:创建 sign-in / sign-up 页面。
- 在进入 Phase 2 之前,请用户确认计划。
- 仅在用户确认 Phase 1 计划后进入 Phase 2 实现。
- 如果是新/空项目:安装 better-auth,并按计划安装 scoped packages。
- 新项目:创建 auth.ts,写入所有计划中的配置。
- 新项目:创建 auth-client.ts,使用对应框架客户端。
- 新项目:设置路由处理器。
- 新项目:设置环境变量。
- 新项目:运行 CLI migrate/generate。
- 新项目:添加计划中的插件。
- 新项目:创建认证 UI 页面。
- 如果是从现有认证迁移:审计当前认证的缺口。
- 迁移:规划增量迁移。
- 迁移:与现有认证并行安装 better-auth。
- 迁移:先迁移路由,再迁移会话逻辑,再迁移 UI。
- 迁移:移除旧认证库。
- 迁移:参阅 docs 中的迁移指南。
- 如果是给现有项目添加 auth:分析项目结构。
- 添加 auth:安装 better-auth。
- 添加 auth:创建匹配计划的 auth 配置。
- 添加 auth:添加路由处理器。
- 添加 auth:运行 schema 迁移。
- 添加 auth:集成到现有页面。
- 添加 auth:添加计划中的插件和功能。
- 实现结束时,彻底指导用户剩余下一步,例如设置 OAuth 应用凭证、部署环境变量、测试流程。
- 核心安装命令:npm install better-auth。
- 按需安装 scoped package:@better-auth/passkey 用于 WebAuthn/Passkey auth。
- 按需安装 scoped package:@better-auth/sso 用于 SAML/OIDC 企业 SSO。
- 按需安装 scoped package:@better-auth/stripe 用于 Stripe 支付。
- 按需安装 scoped package:@better-auth/scim 用于 SCIM 用户预配。
- 按需安装 scoped package:@better-auth/expo 用于 React Native/Expo。
- 环境变量设置 BETTER_AUTH_SECRET=<32+ chars,使用 openssl rand -base64 32 生成>。
- 环境变量设置 BETTER_AUTH_URL=http://localhost:3000。
- 环境变量设置 DATABASE_URL=<数据库连接字符串>。
- 按需添加 OAuth secrets:GITHUB_CLIENT_ID、GITHUB_CLIENT_SECRET、GOOGLE_CLIENT_ID 等。
- 服务端配置放在 lib/auth.ts 或 src/lib/auth.ts。
- 最小服务端配置需要 database(连接或 adapter)和 emailAndPassword: { enabled: true } 用于邮箱/密码认证。
- 标准服务端配置增加 socialProviders(OAuth providers,如 google、github 等)。
- 标准服务端配置增加 emailVerification.sendVerificationEmail 邮箱验证处理器。
- 标准服务端配置增加 emailAndPassword.sendResetPassword 密码重置处理器。
- 完整服务端配置增加 plugins(功能插件数组)。
- 完整服务端配置增加 session(过期、cookie cache 设置)。
- 完整服务端配置增加 account.accountLinking(多提供商链接)。
- 完整服务端配置增加 rateLimit(限流配置)。
- 导出类型:export type Session = typeof auth.$Infer.Session。
- 按框架导入客户端:React/Next.js → better-auth/react。
- 按框架导入客户端:Vue → better-auth/vue。
- 按框架导入客户端:Svelte → better-auth/svelte。
- 按框架导入客户端:Solid → better-auth/solid。
- 按框架导入客户端:Vanilla JS → better-auth/client。
- 客户端插件放在 createAuthClient({ plugins: [...] })。
- 客户端常用导出:signIn、signUp、signOut、useSession、getSession。
- Next.js App Router 路由处理器:文件 app/api/auth/[...all]/route.ts,处理器 toNextJsHandler(auth),导出 { GET, POST }。
- Next.js Pages 路由处理器:文件 pages/api/auth/[...all].ts,处理器 toNextJsHandler(auth),默认导出。
- Express 路由处理器:任意文件,app.all('/api/auth/*', toNodeHandler(auth))。
- SvelteKit 路由处理器:src/hooks.server.ts,svelteKitHandler(auth)。
- SolidStart 路由处理器:路由文件,solidStartHandler(auth)。
- Hono 路由处理器:路由文件,auth.handler(c.req.raw)。
- Next.js Server Components:向 auth 配置添加 nextCookies() 插件。
- 数据库迁移 Built-in Kysely:npx auth@latest migrate,直接应用。
- 数据库迁移 Prisma:npx auth@latest generate --output prisma/schema.prisma,然后 npx prisma migrate dev。
- 数据库迁移 Drizzle(开发):npx auth@latest generate --output src/db/auth-schema.ts,然后 npx drizzle-kit push。
- 数据库迁移 Drizzle(生产):npx auth@latest generate --output src/db/auth-schema.ts,然后 npx drizzle-kit generate,然后 npx drizzle-kit migrate。
- 注意:drizzle-kit push 跳过迁移文件,仅开发安全;生产使用 drizzle-kit generate + drizzle-kit migrate。
- 添加插件后重新运行 CLI generate/migrate。
- SQLite adapter:直接传入 better-sqlite3 或 bun:sqlite 实例。
- PostgreSQL adapter:直接传入 pg.Pool 实例。
- MySQL adapter:直接传入 mysql2 pool。
- Prisma adapter:从 better-auth/adapters/prisma 导入 prismaAdapter(prisma, { provider: 'postgresql' })。
- Drizzle (pg) adapter:从 better-auth/adapters/drizzle 导入 drizzleAdapter(db, { provider: 'pg' })。
- Drizzle (mysql) adapter:drizzleAdapter(db, { provider: 'mysql' })。
- Drizzle (sqlite) adapter:drizzleAdapter(db, { provider: 'sqlite' })。
- MongoDB adapter:从 better-auth/adapters/mongodb 导入 mongodbAdapter(db)。
- Drizzle + PostgreSQL 使用 drizzleAdapter 前,先初始化 db 实例。
- Drizzle + PostgreSQL 选项 1 node-postgres (pg):import { drizzle } from 'drizzle-orm/node-postgres';import { Pool } from 'pg';import * as schema from './auth-schema';const pool = new Pool({ connectionString: process.env.DATABASE_URL });export const db = drizzle(pool, { schema })。
- Drizzle + PostgreSQL 选项 2 postgres.js:import { drizzle } from 'drizzle-orm/postgres-js';import postgres from 'postgres';import * as schema from './auth-schema';const client = postgres(process.env.DATABASE_URL!);export const db = drizzle(client, { schema })。
- Drizzle + PostgreSQL 选项 3 Neon serverless:import { drizzle } from 'drizzle-orm/neon-http';import { neon } from '@neondatabase/serverless';import * as schema from './auth-schema';const sql = neon(process.env.DATABASE_URL!);export const db = drizzle(sql, { schema })。
- 将 db 传给 Better Auth:import { betterAuth } from 'better-auth';import { drizzleAdapter } from 'better-auth/adapters/drizzle';import { db } from './db';export const auth = betterAuth({ database: drizzleAdapter(db, { provider: 'pg' }), ... })。
- 创建 drizzle.config.ts,供 drizzle-kit 命令查找 schema:import { defineConfig } from 'drizzle-kit';export default defineConfig({ schema: './src/db/auth-schema.ts', out: './drizzle', dialect: 'postgresql', dbCredentials: { url: process.env.DATABASE_URL! } })。
- 插件 twoFactor:server import better-auth/plugins,client import twoFactorClient,用途 2FA with TOTP/OTP。
- 插件 organization:server import better-auth/plugins,client import organizationClient,用途 Teams/orgs。
- 插件 admin:server import better-auth/plugins,client import adminClient,用途用户管理。
- 插件 bearer:server import better-auth/plugins,无 client import,用途 API token auth。
- 插件 openAPI:server import better-auth/plugins,无 client import,用途 API docs。
- 插件 passkey:server import @better-auth/passkey,client import passkeyClient,用途 WebAuthn。
- 插件 sso:server import @better-auth/sso,无 client import,用途企业 SSO。
- 插件模式:服务端插件 + 客户端插件 + 运行迁移。
- 登录流程:signIn.email({ email, password }) 或 signIn.social({ provider, callbackURL })。
- 登录流程:处理 response 中的 error。
- 登录流程:成功后重定向。
- 客户端会话检查:useSession() hook 返回 { data: session, isPending }。
- 服务端会话检查:auth.api.getSession({ headers: await headers() })。
- 保护路由:检查 session,若为 null 则重定向到 /sign-in。
- 安全清单:设置 BETTER_AUTH_SECRET(32+ chars)。
- 安全清单:生产环境设置 advanced.useSecureCookies: true。
- 安全清单:配置 trustedOrigins。
- 安全清单:启用 rate limits。
- 安全清单:启用邮箱验证。
- 安全清单:实现密码重置。
- 安全清单:敏感应用启用 2FA。
- 安全清单:不要禁用 CSRF protection。
- 安全清单:审查 account.accountLinking。
- 故障排查 Secret not set:添加 BETTER_AUTH_SECRET 环境变量。
- 故障排查 Invalid Origin:将域名加入 trustedOrigins。
- 故障排查 Cookies not setting:检查 baseURL 与域名匹配;生产启用 secure cookies。
- 故障排查 OAuth callback errors:在提供商 dashboard 验证 redirect URIs。
- 故障排查添加插件后出现类型错误:重新运行 CLI generate/migrate。
- 查阅 Docs:https://better-auth.com/docs。
- 查阅 Examples:https://github.com/better-auth/examples。
- 查阅 Plugins:https://better-auth.com/docs/concepts/plugins。
- 查阅 CLI:https://better-auth.com/docs/concepts/cli。
- 查阅 Migration Guides:https://better-auth.com/docs/guides。
适用边界 · 注意事项
- 非 TypeScript/JavaScript 项目,或无法使用 Node/npm/npx 的项目。
- 不愿引入 Better Auth,或必须使用其他认证库、自研认证体系的场景。
- 只需要静态前端页面,没有服务端、数据库或会话需求,或无法配置数据库与密钥的场景。