mcpField
B
better-auth-best-practices

better-auth-best-practices

github.com/epicenterhq安全4.8k66 次安装2 周前更新
代码仓库

关于 better-auth-best-practices

面向在 TypeScript 项目中集成 Better Auth 的开发者,提供配置、会话、安全选项和插件的实施参考。内容涵盖常见陷阱,并指导在关键 API 细节上核对官方文档与源码。

主要功能

  1. 01服务器与客户端配置参考
  2. 02数据库适配器与迁移指引
  3. 03会话存储和 Cookie 缓存说明
  4. 04安全与限流选项提示
  5. 05插件配置及常见问题

适用场景

  1. 01配置 Better Auth 注册与登录
  2. 02排查 ORM 模型名称配置
  3. 03调整会话存储和 Cookie 策略
  4. 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 模型、架构和存储问题。

设置工作流

  1. 安装:npm install better-auth
  2. 设置环境变量:BETTER_AUTH_SECRET 和 BETTER_AUTH_URL
  3. 创建带有数据库和配置的 auth.ts
  4. 为所用框架创建路由处理程序
  5. 运行 npx @better-auth/cli@latest migrate
  6. 验证:调用 GET /api/auth/ok——应返回 { status: "ok" }

快速参考

环境变量
  • 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插件数组
trustedOriginsCSRF 允许列表

数据库

**直接连接:**传入 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"。


会话管理

存储优先级:

  1. 如果定义了 secondaryStorage → 会话存储在其中(而非数据库)
  2. 设置 session.storeSessionInDatabase: true 也会将会话持久化到数据库
  3. 没有数据库且启用了 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 Cookie
  • disableCSRFCheck - ⚠️ 安全风险
  • disableOriginCheck - ⚠️ 安全风险
  • crossSubDomainCookies.enabled - 在子域之间共享 Cookie
  • ipAddress.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>()。


常见注意事项

  1. 模型名与表名 - 配置使用 ORM 模型名,而非数据库表名
  2. 插件架构 - 添加插件后重新运行 CLI
  3. 次级存储 - 默认将会话存储在那里,而非数据库
  4. Cookie 缓存 - 自定义会话字段不会缓存,每次都会重新获取
  5. 无状态模式 - 无数据库时,会话仅存储在 Cookie 中;缓存过期时会退出登录
  6. 更改邮箱流程 - 先发送到当前邮箱,再发送到新邮箱

资源

评论

支持 Markdown