BetterAuth最佳实践集成指南Skill better-auth-best-practices

该技能用于指导开发者如何集成和使用 Better Auth 这一全面的 TypeScript 身份验证框架。它涵盖了从环境变量配置、数据库适配器选择、会话管理、安全设置到插件扩展等全流程的最佳实践。关键词包括:Better Auth 集成、TypeScript 身份验证、用户认证框架、OAuth 配置、会话管理、安全插件、后端开发、Web 应用安全。

后端开发 0 次安装 0 次浏览 更新于 3/2/2026

name: better-auth-best-practices description: 集成 Better Auth - 全面的 TypeScript 身份验证框架的技能

Better Auth 集成指南

请始终查阅 better-auth.com/docs 获取代码示例和最新 API。

Better Auth 是一个 TypeScript 优先、框架无关的身份验证框架,通过插件支持电子邮件/密码、OAuth、魔法链接、通行密钥等功能。


快速参考

环境变量

  • BETTER_AUTH_SECRET - 加密密钥(至少 32 个字符)。生成命令:openssl rand -base64 32
  • BETTER_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.Poolmysql2 连接池、better-sqlite3bun:sqlite 实例。

ORM 适配器:better-auth/adapters/drizzlebetter-auth/adapters/prismabetter-auth/adapters/mongodb 导入。

关键点: Better Auth 使用适配器模型名称,而非底层表名。如果 Prisma 模型是 User 映射到表 users,请使用 modelName: "user"(Prisma 引用),而不是 "users"


会话管理

存储优先级:

  1. 如果定义了 secondaryStorage → 会话存储在那里(而非数据库)
  2. 设置 session.storeSessionInDatabase: true 以同时持久化到数据库
  3. 无数据库 + cookieCache → 完全无状态模式

Cookie 缓存策略:

  • compact(默认)- Base64url + HMAC。最小。
  • jwt - 标准 JWT。可读但已签名。
  • jwe - 加密。安全性最高。

关键选项: session.expiresIn(默认 7 天)、session.updateAge(刷新间隔)、session.cookieCache.maxAgesession.cookieCache.version(更改以使所有会话失效)。


用户与账户配置

用户: user.modelNameuser.fields(列映射)、user.additionalFieldsuser.changeEmail.enabled(默认禁用)、user.deleteUser.enabled(默认禁用)。

账户: account.modelNameaccount.accountLinking.enabledaccount.storeAccountCookie(用于无状态 OAuth)。

注册所需字段: emailname 字段。


电子邮件流程

  • emailVerification.sendVerificationEmail - 必须定义才能使验证工作
  • emailVerification.sendOnSignUp / sendOnSignIn - 自动发送触发器
  • emailAndPassword.sendResetPassword - 密码重置电子邮件处理程序

安全

advanced 中:

  • useSecureCookies - 强制 HTTPS Cookie
  • disableCSRFCheck - ⚠️ 安全风险
  • disableOriginCheck - ⚠️ 安全风险
  • crossSubDomainCookies.enabled - 跨子域共享 Cookie
  • ipAddress.ipAddressHeaders - 代理的自定义 IP 头
  • database.generateId - 自定义 ID 生成或 "serial"/"uuid"/false

速率限制: rateLimit.enabledrateLimit.windowrateLimit.maxrateLimit.storage(“memory” | “database” | “secondary-storage”)。


钩子

端点钩子: hooks.before / hooks.after - { matcher, handler } 数组。使用 createAuthMiddleware。访问 ctx.pathctx.context.returned(之后)、ctx.context.session

数据库钩子: databaseHooks.user.create.before/after,同样适用于 sessionaccount。适用于添加默认值或后创建操作。

钩子上下文(ctx.context): sessionsecretauthCookiespassword.hash()/verify()adapterinternalAdaptergenerateId()tablesbaseURL


插件

从专用路径导入以实现 tree-shaking:

import { twoFactor } from "better-auth/plugins/two-factor"

而不是 from "better-auth/plugins"

热门插件: twoFactororganizationpasskeymagicLinkemailOtpusernamephoneNumberadminapiKeybearerjwtmultiSessionssooauthProvideroidcProvideropenAPIgenericOAuth

客户端插件放在 createAuthClient({ plugins: [...] }) 中。


客户端

从以下位置导入:better-auth/client(原生)、better-auth/reactbetter-auth/vuebetter-auth/sveltebetter-auth/solid

关键方法:signUp.email()signIn.email()signIn.social()signOut()useSession()getSession()revokeSession()revokeSessions()


类型安全

推断类型:typeof auth.$Infer.Sessiontypeof auth.$Infer.Session.user

对于独立的客户端/服务器项目:createAuthClient<typeof auth>()


常见问题

  1. 模型名与表名 - 配置使用 ORM 模型名,而非数据库表名
  2. 插件模式 - 添加插件后重新运行 CLI
  3. 二级存储 - 会话默认存储在那里,而非数据库
  4. Cookie 缓存 - 自定义会话字段不缓存,始终重新获取
  5. 无状态模式 - 无数据库 = 会话仅存储在 Cookie 中,缓存过期时注销
  6. 更改电子邮件流程 - 先发送到当前电子邮件,然后发送到新电子邮件

资源