@raypx/auth
Better Auth 集成,支持懒加载初始化。
@raypx/auth 封装了 Better Auth 的配置与初始化,提供 Drizzle ORM 适配器、UUID v7 主键生成和动态 OAuth 提供商注册。
createAuth()
创建 Better Auth 实例。每次调用都会创建新实例。
import { createAuth } from "@raypx/auth"
const auth = createAuth()内部实现包括:
- Drizzle 适配器:使用
drizzleAdapter(db, { provider: "pg", schema })连接数据库 - UUID v7:通过
generateId覆盖默认的 ID 生成策略,使用时间有序的 UUID - 邮箱密码认证:默认启用,包含密码重置和邮箱验证
- TanStack Start Cookies 插件:
tanstackStartCookies()处理跨端 Cookie
OAuth 提供商
OAuth 提供商根据环境变量动态注册——只有在对应环境变量存在时才会启用:
| 提供商 | 所需环境变量 |
|---|---|
VITE_PUBLIC_AUTH_GOOGLE_ID + AUTH_GOOGLE_SECRET | |
| GitHub | AUTH_GITHUB_ID + AUTH_GITHUB_SECRET |
// 内部逻辑简化
const socialProviders = {}
if (env.VITE_PUBLIC_AUTH_GOOGLE_ID && env.AUTH_GOOGLE_SECRET) {
socialProviders.google = {
clientId: env.VITE_PUBLIC_AUTH_GOOGLE_ID,
clientSecret: env.AUTH_GOOGLE_SECRET,
}
}getAuth()
获取全局单例 Auth 实例。首次调用时创建,后续返回缓存实例。
import { getAuth } from "@raypx/auth"
const auth = getAuth()推荐使用 getAuth(),避免重复初始化数据库连接和配置。
邮件功能
@raypx/auth 内置了以下邮件发送逻辑:
| 事件 | 触发时机 |
|---|---|
| 邮箱验证 | 注册成功后自动发送 |
| 密码重置 | 用户请求重置时发送 |
密码重置的 Token 有效期为 1 小时,重置成功后会自动撤销所有现有会话。
环境变量
| 变量 | 类型 | 必填 | 说明 |
|---|---|---|---|
AUTH_SECRET | string (min 32) | 是 | 加密密钥 |
AUTH_URL | url | 是 | 应用基础 URL |
AUTH_CORS_ORIGIN | url | 否 | 允许的跨域来源 |
AUTH_EMAIL_FROM_NAME | string | 否 | 发件人名称 |
AUTH_GOOGLE_SECRET | string | 否 | Google OAuth 密钥 |
AUTH_GITHUB_ID | string | 否 | GitHub OAuth 客户端 ID |
AUTH_GITHUB_SECRET | string | 否 | GitHub OAuth 密钥 |
VITE_PUBLIC_AUTH_GOOGLE_ID | string | 否 | Google OAuth 客户端 ID |
VITE_PUBLIC_AUTH_GOOGLE_ENABLED | string | 否 | 是否启用 Google 登录(前端) |
VITE_PUBLIC_AUTH_GITHUB_ENABLED | string | 否 | 是否启用 GitHub 登录(前端) |
auth(已废弃)
import { auth } from "@raypx/auth" // 已废弃auth 是一个 Proxy 对象,内部调用 getAuth()。已标记为 @deprecated,新代码请使用 getAuth()。
在 RPC 中的使用
@raypx/rpc 的 Context 通过 auth.api.getSession() 获取用户会话:
import { auth } from "@raypx/auth"
export async function createContext({ req }: { req: Request }) {
const session = await auth.api.getSession({ headers: req.headers })
return { session }
}