关于 better-auth-best-practices
面向在 TypeScript 项目中集成 Better Auth 的开发者,提供配置、会话、安全选项和插件的实施参考。内容涵盖常见陷阱,并指导在关键 API 细节上核对官方文档与源码。
主要功能
- 01服务器与客户端配置参考
- 02数据库适配器与迁移指引
- 03会话存储和 Cookie 缓存说明
- 04安全与限流选项提示
- 05插件配置及常见问题
适用场景
- 01配置 Better Auth 注册与登录
- 02排查 ORM 模型名称配置
- 03调整会话存储和 Cookie 策略
- 04添加插件后重新生成架构
MCP 相关
指南包含通过 Better Auth CLI 为 AI 工具添加 MCP 的命令示例。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ epicenterhq/ epicenter --skill better-auth-best-practices安装后在 Claude Code 中输入/better-auth-best-practices确认已加载。
详细介绍
Better Auth 集成指南
参考仓库
- Better Auth — 带插件的 TypeScript 身份验证框架
上游资料核实
当 Better Auth API 签名、适配器行为、生成的架构、插件选项、会话存储、Cookie 行为或安全默认值会影响正确性时,请先针对 better-auth/better-auth 向 DeepWiki 提出具体问题,再依据记忆作答。先用它了解情况,然后在修改代码前,通过本地已安装的类型、源码或官方文档核实关键细节。
下文已记录的稳定基础设置无需查询 DeepWiki。
代码示例和最新 API 请务必查阅 better-auth.com/docs。
何时使用此技能
在以下情况下使用此模式:
- 在 TypeScript 项目中配置 Better Auth 服务端和客户端。
- 配置环境变量、数据库适配器和 CLI 迁移。
- 设置会话、Cookie 缓存策略及安全/速率限制选项。
- 添加并配置 Better Auth 插件及相应的客户端插件。
- 排查常见的 Better Auth 模型、架构和存储问题。
设置工作流
- 安装:
npm install better-auth - 设置环境变量:
BETTER_AUTH_SECRET和BETTER_AUTH_URL - 创建带有数据库和配置的
auth.ts - 为所用框架创建路由处理程序
- 运行
npx @better-auth/cli@latest migrate - 验证:调用
GET /api/auth/ok——应返回{ status: "ok" }
快速参考
环境变量
BETTER_AUTH_SECRET- 加密密钥(至少 32 个字符)。生成命令:openssl rand -base64 32BETTER_AUTH_URL- 基础 URL(例如,https://example.com)
仅当未设置环境变量时,才在配置中定义 baseURL/secret。
文件位置
CLI 会在以下位置查找 auth.ts:./、./lib、./utils 或 ./src 下。自定义路径请使用 --config。
CLI 命令
npx @better-auth/cli@latest migrate- 应用架构(内置适配器)npx @better-auth/cli@latest generate- 为 Prisma/Drizzle 生成架构npx @better-auth/cli mcp --cursor- 将 MCP 添加到 AI 工具
添加或更改插件后,请重新运行。
核心配置选项
| 选项 | 说明 |
|---|---|
appName | 可选的显示名称 |
baseURL | 仅当未设置 BETTER_AUTH_URL 时使用 |
basePath | 默认值为 /api/auth。设为 / 可使用根路径。 |
secret | 仅当未设置 BETTER_AUTH_SECRET 时使用 |
database | 大多数功能必需。请参阅适配器文档。 |
secondaryStorage | 用于会话和速率限制的 Redis/KV |
emailAndPassword | 设为 { enabled: true } 以启用 |
socialProviders | { google: { clientId, clientSecret }, ... } |
plugins | 插件数组 |
trustedOrigins | CSRF 允许列表 |
数据库
**直接连接:**传入 pg.Pool、mysql2 连接池、better-sqlite3 或 bun:sqlite 实例。
**ORM 适配器:**从 better-auth/adapters/drizzle、better-auth/adapters/prisma、better-auth/adapters/mongodb 导入。
**重要:**Better Auth 使用适配器模型名称,而不是底层表名。如果 Prisma 模型为 User,映射到的表为 users,应使用 modelName: "user"(Prisma 引用名),而不是 "users"。
会话管理
存储优先级:
- 如果定义了
secondaryStorage→ 会话存储在其中(而非数据库) - 设置
session.storeSessionInDatabase: true也会将会话持久化到数据库 - 没有数据库且启用了
cookieCache→ 完全无状态模式
Cookie 缓存策略:
compact(默认)- Base64url + HMAC。体积最小。jwt- 标准 JWT。可读,但经过签名。jwe- 加密。安全性最高。
关键选项:session.expiresIn(默认 7 天)、session.updateAge(刷新间隔)、session.cookieCache.maxAge、session.cookieCache.version(更改此值可使所有会话失效)。
用户与账户配置
用户: user.modelName、user.fields(列映射)、user.additionalFields、user.changeEmail.enabled(默认禁用)、user.deleteUser.enabled(默认禁用)。
账户: account.modelName、account.accountLinking.enabled、account.storeAccountCookie(用于无状态 OAuth)。
注册必需字段: email 和 name 字段。
邮件流程
emailVerification.sendVerificationEmail- 必须定义此项,验证才能生效emailVerification.sendOnSignUp/sendOnSignIn- 自动发送触发器emailAndPassword.sendResetPassword- 密码重置邮件处理程序
安全
在 advanced 中:
useSecureCookies- 强制使用 HTTPS CookiedisableCSRFCheck- ⚠️ 安全风险disableOriginCheck- ⚠️ 安全风险crossSubDomainCookies.enabled- 在子域之间共享 CookieipAddress.ipAddressHeaders- 代理的自定义 IP 标头database.generateId- 自定义 ID 生成,或使用"serial"/"uuid"/false
速率限制: rateLimit.enabled、rateLimit.window、rateLimit.max、rateLimit.storage("memory" | "database" | "secondary-storage")。
钩子
端点钩子: hooks.before / hooks.after - { matcher, handler } 数组。使用 createAuthMiddleware。访问 ctx.path、ctx.context.returned(after)和 ctx.context.session。
数据库钩子: databaseHooks.user.create.before/after,session 和 account 也相同。适用于添加默认值或执行创建后操作。
钩子上下文(ctx.context): session、secret、authCookies、password.hash()/verify()、adapter、internalAdapter、generateId()、tables、baseURL。
插件
从专用路径导入以支持摇树优化:
import { twoFactor } from "better-auth/plugins/two-factor"
不要使用 from "better-auth/plugins"。
热门插件: twoFactor、organization、passkey、magicLink、emailOtp、username、phoneNumber、admin、apiKey、bearer、jwt、multiSession、sso、oauthProvider、oidcProvider、openAPI、genericOAuth。
客户端插件应放在 createAuthClient({ plugins: [...] }) 中。
客户端
导入路径:better-auth/client(原生)、better-auth/react、better-auth/vue、better-auth/svelte、better-auth/solid。
关键方法:signUp.email()、signIn.email()、signIn.social()、signOut()、useSession()、getSession()、revokeSession()、revokeSessions()。
类型安全
推断类型:typeof auth.$Infer.Session、typeof auth.$Infer.Session.user。
对于分离的客户端/服务端项目:createAuthClient<typeof auth>()。
常见注意事项
- 模型名与表名 - 配置使用 ORM 模型名,而非数据库表名
- 插件架构 - 添加插件后重新运行 CLI
- 次级存储 - 默认将会话存储在那里,而非数据库
- Cookie 缓存 - 自定义会话字段不会缓存,每次都会重新获取
- 无状态模式 - 无数据库时,会话仅存储在 Cookie 中;缓存过期时会退出登录
- 更改邮箱流程 - 先发送到当前邮箱,再发送到新邮箱