Skip to content

NuxSaaS 中使用 Better Auth 进行身份验证

NuxSaaS 使用 Better Auth,这是一个用于 Nuxt.js 应用程序的综合身份验证解决方案。本文档详细介绍了 NuxSaaS 如何集成 Better Auth 以提供安全灵活的用户身份验证,以及选择此方法的原因。

NuxSaaS 如何实现 Better Auth

Better Auth 主要在 server/utils/auth.ts 文件中进行配置。这个核心文件定义了身份验证策略、数据库适配器、邮件处理和钩子。

主要实现细节:

  1. 核心配置 (server/utils/auth.ts)

    • 数据库适配器:使用 drizzleAdapter 将 Better Auth 与 Drizzle ORM 和 PostgreSQL 数据库连接。与身份验证相关的表(如 useraccountsessionverification)的模式位于 server/database/schema/auth.ts
    • 邮箱和密码:启用并需要邮箱验证。它定义了如何发送重置密码和验证邮件,并与邮件服务(例如 Resend,通过 runtimeConfig 配置)集成。
    • 社交提供商:配置了 OAuth,支持 GitHub 和 Google 等提供商。客户端 ID 和密钥通过 runtimeConfig 管理。
    • 钩子:为审计日志实现 after 钩子。成功和失败的身份验证尝试、密码重置和邮箱验证都使用 logAuditEvent 进行记录。
    • 插件:集成 Better Auth 插件,如用于潜在管理员功能的 admin() 和用于将身份验证与 Stripe 账单关联的 setupStripe()
    typescript
    // server/utils/auth.ts 代码片段
    const createBetterAuth = () => betterAuth({
      baseURL: runtimeConfig.public.baseURL,
      secret: runtimeConfig.betterAuthSecret,
      database: drizzleAdapter(
        getDB(),
        {
          provider: 'pg',
          schema
        }
      ),
      // ... 其他配置,如 emailAndPassword、socialProviders、hooks
    });
  2. 会话获取 (app/plugins/auth.server.tsapp/plugins/auth.client.ts)

    • 在服务器端 (auth.server.ts),如果页面是服务器端渲染且未缓存,则在初始请求期间获取会话,确保用户状态立即可用。
    • 在客户端 (auth.client.ts),如果页面未进行服务器端渲染,或者已预渲染/缓存,则会进行会话获取,以避免水合不匹配并确保客户端与身份验证状态同步。
  3. 路由保护 (server/middleware/1.auth.tsapp/middleware/auth.global.ts)

    • 服务器端中间件 (1.auth.ts) 保护 API 路由,如 /api/admin/**,确保只有具有“admin”角色的已验证用户才能访问它们。它使用 server/utils/auth.ts 中的 requireAuth
    • 全局客户端中间件 (auth.global.ts) 处理页面级路由保护。它检查身份验证状态并根据路由元数据(例如,受保护页面的 auth: true,仅限未经身份验证用户访问的页面的 guest: true)重定向用户。
  4. 可组合函数 (app/composables/useAuth.ts)

    • 自定义可组合函数 useAuth() 可能包装了 Better Auth 的客户端实用程序,提供了一种在 Vue 组件中方便访问会话状态、登录/注销函数等的方法。
  5. 数据库模式 (server/database/schema/auth.ts)

    • 此文件定义了 Better Auth 所需表的 Drizzle ORM 模式,例如 useraccountverification。这些表存储用户凭据、关联的社交帐户和邮箱验证令牌。

为什么选择 Better Auth?

  • 可扩展性强:支持各种身份验证策略(OAuth、邮箱/密码、凭据)并允许自定义提供商。
  • 默认安全:实施安全最佳实践,例如 CSRF 保护和安全会话管理。
  • 数据库无关(通过适配器):虽然 NuxSaaS 使用 Drizzle 和 PostgreSQL,但 Better Auth 支持多种数据库适配器,提供了灵活性。
  • 服务器端和客户端实用程序:为后端身份验证逻辑和前端会话管理提供全面的工具。
  • 活跃的社区和开发:作为 Nuxt 身份验证的热门选择,它受益于持续的开发和社区支持。

通过使用 Better Auth,NuxSaaS 提供了一个强大、安全且对开发人员友好的身份验证系统,该系统易于维护和扩展。