mcpField
B
better-auth-best-practices

better-auth-best-practices

github.com/pedronauck开发646281 次安装1 周前更新
代码仓库

关于 better-auth-best-practices

为在 TypeScript 项目中集成 Better Auth 的开发者提供配置与使用参考,涵盖数据库、会话、安全、插件和客户端常见要点。

主要功能

  1. 01配置与环境变量说明
  2. 02数据库适配器与模型映射
  3. 03会话存储与 Cookie 缓存
  4. 04安全选项和速率限制
  5. 05插件、客户端与类型推断

适用场景

  1. 01配置 Better Auth 环境变量
  2. 02排查 ORM 模型名称映射
  3. 03规划会话存储与缓存
  4. 04接入插件并生成数据库架构

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pedronauck/skills --skill better-auth-best-practices

安装后在 Claude Code 中输入/better-auth-best-practices确认已加载。

详细介绍

Better Auth 集成指南

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

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插件数组
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