认证
基于 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()],