mcpField
B
better-auth-best-practices

better-auth-best-practices

github.com/andrelandgraf安全23170 次安装21 周前更新
代码仓库

关于 better-auth-best-practices

better-auth-best-practices 是面向 Better Auth 集成者的开发指南,汇总配置、数据库、会话、安全、插件和客户端要点,帮助查找常见配置陷阱。

主要功能

  1. 01核心配置与环境变量
  2. 02数据库适配与模型映射
  3. 03会话存储和 Cookie 缓存
  4. 04邮件流程与安全设置
  5. 05钩子、插件和客户端用法

适用场景

  1. 01配置 Better Auth 环境与数据库
  2. 02排查会话存储或模型映射问题
  3. 03添加插件后生成所需架构
  4. 04检查认证流程的安全设置

MCP 相关

README 提及 Better Auth CLI 的 `mcp --cursor` 命令,可将 MCP 添加到 AI 工具。

安装

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

$npx skills add https://github.com/andrelandgraf/fullstackrecipes --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