Raypx

认证

基于 Better Auth 构建的认证系统,支持邮箱密码和 OAuth 登录。

Raypx 使用 Better Auth 构建了完整的认证系统,开箱即支持以下登录方式:

  • 邮箱密码——用户注册、登录、邮箱验证、密码重置
  • Google OAuth——通过 Google 账号一键登录
  • GitHub OAuth——通过 GitHub 账号一键登录

架构概览

认证功能封装在 @raypx/auth 包中,通过以下方式被应用使用:

服务端

服务端使用 getAuth() 获取懒加载的 Better Auth 单例实例。该实例在首次调用时创建,后续调用复用同一个对象:

// packages/auth/src/index.ts
export function getAuth() {
  if (!_auth) _auth = createAuth()
  return _auth
}

createAuth() 函数负责配置数据库适配器、邮箱密码认证、OAuth 提供商、邮箱验证等功能。

客户端

客户端通过 Better Auth 的 React 钩子与认证系统交互:

// src/lib/auth-client.ts
import { createAuthClient } from "better-auth/react"

export const authClient = createAuthClient({})

认证路由

所有认证请求通过 TanStack Start 文件路由 /api/auth/$ 处理,该路由同时集成了限流中间件:

// src/routes/api/auth/$.ts
export const Route = createFileRoute("/api/auth/$")({
  server: {
    handlers: {
      GET: ({ request }) => {
        const result = checkRateLimit(request)
        if (result && !result.success) {
          return new Response("Too Many Requests", { status: 429 })
        }
        return auth.handler(request)
      },
      POST: ({ request }) => {
        const result = checkRateLimit(request)
        if (result && !result.success) {
          return new Response("Too Many Requests", { status: 429 })
        }
        return auth.handler(request)
      },
    },
  },
})

会话管理

Raypx 使用 Better Auth 的 tanstackStartCookies() 插件,将会话信息存储在 Cookie 中,与 TanStack Start 的请求上下文无缝集成:

plugins: [tanstackStartCookies()],

接下来

On this page