🚀 快速安装
复制以下命令并运行,立即安装此 Skill:
npx @anthropic-ai/skills install better-auth/skills/create-auth-skill
💡 提示:需要 Node.js 和 NPM
创建身份验证技能
使用 Better Auth 为 TypeScript/JavaScript 应用程序添加身份验证的指南。
有关代码示例和语法,请参阅 better-auth.com/docs。
阶段 1:规划(实施前必需)
在编写任何代码之前,通过扫描项目并向用户提出结构化问题来收集需求。这可确保实现满足他们的需求。
步骤 1:扫描项目
分析代码库以自动检测:
- 框架 — 查找
next.config,svelte.config,nuxt.config,astro.config,vite.config,或 Express/Hono 入口文件。 - 数据库/对象关系映射 — 查找
prisma/schema.prisma,drizzle.config,package.json依赖项(pg,mysql2,better-sqlite3,mongoose,mongodb)。 - 现有身份验证 — 在
package.json或导入中查找现有的身份验证库(next-auth,lucia,clerk,supabase/auth,firebase/auth)。 - 包管理器 — 检查是否存在
pnpm-lock.yaml,yarn.lock,bun.lockb或package-lock.json。
使用你找到的信息来预填默认值,并跳过你已经可以回答的问题。
步骤 2:提出规划问题
使用 AskQuestion 工具在单次调用中向用户提出所有适用的问题。跳过任何你已从扫描中获得确切答案的问题。将它们归入标题下,例如”身份验证设置规划”。
要问的问题:
- 项目类型(如果已检测到则跳过)
- 提示:”这是什么类型的项目?”
- 选项:从头开始的新项目 | 为现有项目添加身份验证 | 从其他身份验证库迁移
- 框架(如果已检测到则跳过)
- 提示:”你正在使用哪个框架?”
- 选项:Next.js(应用程序路由器) | Next.js(页面路由器) | SvelteKit | Nuxt | Astro | Express | Hono | SolidStart | 其他
- 数据库与对象关系映射(如果已检测到则跳过)
- 提示:”你将使用哪种数据库设置?”
- 选项:PostgreSQL(Prisma) | PostgreSQL(Drizzle) | PostgreSQL(pg 驱动) | MySQL(Prisma) | MySQL(Drizzle) | MySQL(mysql2 驱动) | SQLite(Prisma) | SQLite(Drizzle) | SQLite(better-sqlite3 驱动) | MongoDB(Mongoose) | MongoDB(原生驱动)
- 身份验证方法(始终询问,允许多选)
- 提示:”你需要哪些登录方式?”
- 选项:邮箱与密码 | 社交 OAuth(谷歌、GitHub 等) | 魔法链接(无密码邮箱) | 通行密钥(WebAuthn) | 手机号码
allow_multiple: true
- 社交提供商(仅当用户在上面选择了社交 OAuth 时询问——在后续调用中询问)
- 提示:”你需要哪些社交提供商?”
- 选项:谷歌 | GitHub | 苹果 | 微软 | Discord | 推特/X
allow_multiple: true
- 邮箱验证(仅当上面选择了邮箱与密码时询问——在后续调用中询问)
- 提示:”你是否需要邮箱验证?”
- 选项:是 | 否
- 邮箱提供商(仅当邮箱验证为是,或在功能中选择了密码重置时询问——在后续调用中询问)
- 提示:”你想如何发送电子邮件?”
- 选项:Resend | 暂时模拟(控制台输出)
- 功能与插件(始终询问,允许多选)
- 提示:”你需要哪些附加功能?”
- 选项:双因素身份验证 (2FA) | 组织/团队 | 管理仪表板 | 应用程序编程接口令牌 | 密码重置 | 以上都不需要
allow_multiple: true
- 身份验证页面(始终询问,允许多选——根据之前的回答预选)
- 提示:”你需要哪些身份验证页面?”
- 选项因之前的回答而异:
- 始终可用:登录 | 注册
- 如果选择了邮箱与密码:忘记密码 | 重置密码
- 如果启用了邮箱验证:邮箱验证
allow_multiple: true
- 身份验证用户界面样式(始终询问)
- 提示:”你想要什么风格的认证页面?选择一个或描述你自己的。”
- 选项:极简干净 | 居中卡片带背景 | 分割布局(表单 + 主图) | 悬浮 / 毛玻璃效果 | 其他(我来描述)
步骤 3:总结计划
收集答案后,以 Markdown 检查清单的形式呈现一个简洁的实施计划。示例:
## 身份验证实施计划
- **框架:** Next.js(应用程序路由器)
- **数据库:** 通过 Prisma 使用 PostgreSQL
- **身份验证方法:** 邮箱/密码、谷歌 OAuth、GitHub OAuth
- **插件:** 双因素身份验证、组织、邮箱验证
- **用户界面:** 自定义表单
### 步骤
1. 安装 `better-auth` 和 `@better-auth/cli`
2. 创建包含服务器配置的 `lib/auth.ts`
3. 创建包含 React 客户端的 `lib/auth-client.ts`
4. 在 `app/api/auth/[...all]/route.ts` 设置路由处理程序
5. 配置 Prisma 适配器并生成架构
6. 添加谷歌和 GitHub OAuth 提供商
7. 启用 `twoFactor` 和 `organization` 插件
8. 设置邮箱验证处理程序
9. 运行迁移
10. 创建登录 / 注册页面
在进入阶段 2 之前,要求用户确认该计划。
阶段 2:实施
只有在用户确认阶段 1 的计划后,才能继续执行此阶段。
遵循下面的决策树,由上面收集的答案引导。
这是新/空项目吗?
├─ 是 → 新项目设置
│ 1. 安装 better-auth(+ 根据计划安装范围包)
│ 2. 创建包含所有计划配置的 auth.ts
│ 3. 创建包含框架客户端的 auth-client.ts
│ 4. 设置路由处理程序
│ 5. 设置环境变量
│ 6. 运行命令行界面迁移/生成
│ 7. 根据计划添加插件
│ 8. 创建身份验证用户界面页面
│
├─ 迁移中 → 从现有身份验证迁移
│ 1. 审计当前身份验证,找出差距
│ 2. 计划增量迁移
│ 3. 与现有身份验证并存安装 better-auth
│ 4. 迁移路由,然后迁移会话逻辑,然后迁移用户界面
│ 5. 移除旧的身份验证库
│ 6. 参阅文档中的迁移指南
│
└─ 添加中 → 为现有项目添加身份验证
1. 分析项目结构
2. 安装 better-auth
3. 创建匹配计划的身份验证配置
4. 添加路由处理程序
5. 运行架构迁移
6. 集成到现有页面中
7. 添加计划的插件和功能
在实施结束时,全面指导用户完成后续步骤(例如,设置 OAuth 应用程序凭据、部署环境变量、测试流程)。
安装
核心: npm install better-auth
范围包(根据需要):
| 包 | 用例 |
|---|---|
@better-auth/passkey |
WebAuthn/通行密钥认证 |
@better-auth/sso |
SAML/OIDC 企业单点登录 |
@better-auth/stripe |
Stripe 支付 |
@better-auth/scim |
SCIM 用户配置 |
@better-auth/expo |
React Native/Expo |
环境变量
BETTER_AUTH_SECRET=<32+ 字符,使用以下命令生成: openssl rand -base64 32>
BETTER_AUTH_URL=http://localhost:3000
DATABASE_URL=<你的数据库连接字符串>
根据需要添加 OAuth 密钥:GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GOOGLE_CLIENT_ID 等。
服务器配置 (auth.ts)
位置: lib/auth.ts 或 src/lib/auth.ts
最小配置需要:
database– 连接或适配器emailAndPassword: { enabled: true }– 用于邮箱/密码认证
标准配置添加:
socialProviders– OAuth 提供商(谷歌、GitHub 等)emailVerification.sendVerificationEmail– 邮箱验证处理程序emailAndPassword.sendResetPassword– 密码重置处理程序
完整配置添加:
plugins– 功能插件数组session– 过期时间、cookie 缓存设置account.accountLinking– 多提供商账户关联rateLimit– 速率限制配置
导出类型: export type Session = typeof auth.$Infer.Session
客户端配置 (auth-client.ts)
按框架导入:
| 框架 | 导入 |
|---|---|
| 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/api/auth/[...all]/route.ts |
toNextJsHandler(auth) → 导出 { GET, POST } |
| Next.js 页面 | 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 服务器组件: 将 nextCookies() 插件添加到身份验证配置中。
数据库迁移
| 适配器 | 命令 |
|---|---|
| 内置 Kysely | npx @better-auth/cli@latest migrate(直接应用) |
| Prisma | npx @better-auth/cli@latest generate --output prisma/schema.prisma 然后 npx prisma migrate dev |
| Drizzle | npx @better-auth/cli@latest generate --output src/db/auth-schema.ts 然后 npx drizzle-kit push |
添加插件后重新运行。
数据库适配器
| 数据库 | 设置 |
|---|---|
| SQLite | 直接传递 better-sqlite3 或 bun:sqlite 实例 |
| PostgreSQL | 直接传递 pg.Pool 实例 |
| MySQL | 直接传递 mysql2 连接池 |
| Prisma | 从 better-auth/adapters/prisma 导入 prismaAdapter(prisma, { provider: "postgresql" }) |
| Drizzle | 从 better-auth/adapters/drizzle 导入 drizzleAdapter(db, { provider: "pg" }) |
| MongoDB | 从 better-auth/adapters/mongodb 导入 mongodbAdapter(db) |
常用插件
| 插件 | 服务器导入 | 客户端导入 | 用途 |
|---|---|---|---|
twoFactor |
better-auth/plugins |
twoFactorClient |
使用 TOTP/OTP 的双因素身份验证 |
organization |
better-auth/plugins |
organizationClient |
团队/组织 |
admin |
better-auth/plugins |
adminClient |
用户管理 |
bearer |
better-auth/plugins |
– | 应用程序编程接口令牌认证 |
openAPI |
better-auth/plugins |
– | 应用程序编程接口文档 |
passkey |
@better-auth/passkey |
passkeyClient |
WebAuthn |
sso |
@better-auth/sso |
– | 企业单点登录 |
插件模式: 服务器插件 + 客户端插件 + 运行迁移。
身份验证用户界面实现
登录流程:
signIn.email({ email, password })或signIn.social({ provider, callbackURL })- 处理响应中的
error - 成功后重定向
会话检查(客户端): useSession() 钩子返回 { data: session, isPending }
会话检查(服务器): auth.api.getSession({ headers: await headers() })
受保护的路由: 检查会话,如果为空则重定向到 /sign-in。
安全检查清单
-
BETTER_AUTH_SECRET已设置(32+ 字符) - 生产环境中
advanced.useSecureCookies: true -
trustedOrigins已配置 - 已启用速率限制
- 已启用邮箱验证
- 已实现密码重置
- 敏感应用启用双因素身份验证
- 未禁用 CSRF 保护
- 已审查
account.accountLinking配置
故障排除
| 问题 | 修复 |
|---|---|
| “密钥未设置” | 添加 BETTER_AUTH_SECRET 环境变量 |
| “无效的来源” | 将域名添加到 trustedOrigins |
| Cookie 未设置 | 检查 baseURL 是否与域名匹配;在生产环境中启用安全 cookie |
| OAuth 回调错误 | 验证提供商仪表板中的重定向统一资源标识符 |
| 添加插件后出现类型错误 | 重新运行命令行界面生成/迁移 |
资源
📄 原始文档
完整文档(英文):
https://skills.sh/better-auth/skills/create-auth-skill
💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

评论(0)