在 Cloudflare 上使用 Better Auth
基于 TypeScript、针对 Cloudflare Workers 优化的轻量身份验证服务
技术栈概览
🔥 Hono
基于 Web 标准构建的快速、轻量 Web 框架。
🔒 Better Auth
面向 TypeScript 的全面身份验证框架。
🧩 Drizzle ORM
轻量、高性能的 TypeScript ORM,以开发体验为设计重点。
🐘 使用 Neon 的 Postgres
针对云环境优化的无服务器 Postgres。
准备工作
1. 安装
# Hono
# > Select cloudflare-workers template
npm create hono
# Better Auth
npm install better-auth
# Drizzle ORM
npm install drizzle-orm
npm install --save-dev drizzle-kit
# Neon
npm install @neondatabase/serverless# Hono
# > Select cloudflare-workers template
pnpm create hono
# Better Auth
pnpm add better-auth
# Drizzle ORM
pnpm add drizzle-orm
pnpm add -D drizzle-kit
# Neon
pnpm add @neondatabase/serverless# Hono
# > Select cloudflare-workers template
yarn create hono
# Better Auth
yarn add better-auth
# Drizzle ORM
yarn add drizzle-orm
yarn add --dev drizzle-kit
# Neon
yarn add @neondatabase/serverless# Hono
# > Select cloudflare-workers template
bun create hono
# Better Auth
bun add better-auth
# Drizzle ORM
bun add drizzle-orm
bun add -d drizzle-kit
# Neon
bun add @neondatabase/serverless2. 环境变量
设置以下环境变量,将应用连接到 Better Auth 和 Neon。
请参阅官方指南:
所需文件:
# Used by Wrangler in local development
# In production, these should be set as Cloudflare Worker Secrets.
BETTER_AUTH_URL=
BETTER_AUTH_SECRET=
DATABASE_URL=# Used for local development and CLI tools such as:
#
# - Drizzle CLI
# - Better Auth CLI
BETTER_AUTH_URL=
BETTER_AUTH_SECRET=
DATABASE_URL=3. Wrangler
设置环境变量后,运行以下脚本,为 Cloudflare Workers 配置生成类型:
npx wrangler types --env-interface CloudflareBindings
# OR
npm run cf-typegenpnpm wrangler types --env-interface CloudflareBindings
# OR
pnpm cf-typegenyarn wrangler types --env-interface CloudflareBindings
# OR
yarn cf-typegenbunx wrangler types --env-interface CloudflareBindings
# OR
bun run cf-typegen然后,确保 tsconfig.json 包含生成的类型。
{
"compilerOptions": {
"types": ["worker-configuration.d.ts"]
}
}4. Drizzle
要使用 Drizzle Kit CLI,请在项目根目录添加以下 Drizzle 配置文件。
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
out: './drizzle',
schema: './src/db/schema.ts',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});应用实现
1. Better Auth 实例
使用 Cloudflare Workers 绑定创建 Better Auth 实例。
可用配置选项很多,远超本示例能覆盖的范围。 请参阅官方文档,根据项目需求进行配置:
(文档:Better Auth - 选项)
import { neon } from '@neondatabase/serverless';
import { drizzle } from 'drizzle-orm/neon-http';
import { drizzleAdapter } from 'better-auth/adapters/drizzle';
import { betterAuth } from 'better-auth';
import { betterAuthOptions } from './options';
import * as schema from "../db/schema"; // Ensure the schema is imported
/**
* Better Auth Instance
*/
export const auth = (env: CloudflareBindings): ReturnType<typeof betterAuth> => {
const sql = neon(env.DATABASE_URL);
const db = drizzle(sql);
return betterAuth({
...betterAuthOptions,
database: drizzleAdapter(db, { provider: 'pg' }),
baseURL: env.BETTER_AUTH_URL,
secret: env.BETTER_AUTH_SECRET,
// Additional options that depend on env ...
});
};import { BetterAuthOptions } from 'better-auth';
/**
* Custom options for Better Auth
*
* Docs: https://www.better-auth.com/docs/reference/options
*/
export const betterAuthOptions: BetterAuthOptions = {
/**
* The name of the application.
*/
appName: 'YOUR_APP_NAME',
/**
* Base path for Better Auth.
* @default "/api/auth"
*/
basePath: '/api',
// .... More options
};2. Better Auth 模式
要创建 Better Auth 所需的表,首先在根目录添加以下文件:
/**
* Better Auth CLI configuration file
*
* Docs: https://www.better-auth.com/docs/concepts/cli
*/
import { neon } from '@neondatabase/serverless';
import { drizzle } from 'drizzle-orm/neon-http';
import { drizzleAdapter } from 'better-auth/adapters/drizzle';
import { betterAuth } from 'better-auth';
import { betterAuthOptions } from './src/lib/better-auth/options';
const { DATABASE_URL, BETTER_AUTH_URL, BETTER_AUTH_SECRET } = process.env;
const sql = neon(DATABASE_URL!);
const db = drizzle(sql);
export const auth: ReturnType<typeof betterAuth> = betterAuth({
...betterAuthOptions,
database: drizzleAdapter(db, { provider: 'pg', schema }), // schema is required in order for bettter-auth to recognize
baseURL: BETTER_AUTH_URL,
secret: BETTER_AUTH_SECRET,
});然后执行以下脚本:
npx @better-auth/cli@latest generate --config ./better-auth.config.ts --output ./src/db/schema.tspnpm dlx @better-auth/cli@latest generate --config ./better-auth.config.ts --output ./src/db/schema.tsyarn dlx @better-auth/cli@latest generate --config ./better-auth.config.ts --output ./src/db/schema.tsbunx @better-auth/cli@latest generate --config ./better-auth.config.ts --output ./src/db/schema.ts3. 将模式应用到数据库
生成模式文件后,运行以下命令创建并应用数据库迁移: 请检查 Wrangler 配置,确保可以正确读取 process.env,以便后续运行 wrangler dev。需要配置 node_compatibility。
npx drizzle-kit generate
npx drizzle-kit migratepnpm drizzle-kit generate
pnpm drizzle-kit migrateyarn drizzle-kit generate
yarn drizzle-kit migratebunx drizzle-kit generate
bunx drizzle-kit migrate4. 挂载处理程序
将 Better Auth 处理程序挂载到 Hono 端点,并确保挂载路径与 Better Auth 实例的 basePath 设置一致。
import { Hono } from 'hono';
import { auth } from './lib/better-auth';
const app = new Hono<{ Bindings: CloudflareBindings }>();
app.on(['GET', 'POST'], '/api/*', (c) => {
return auth(c.env).handler(c.req.raw);
});
export default app;进阶
本示例根据 Hono、Better Auth 和 Drizzle 的官方文档组合而成。不过,它不止于简单集成,还提供以下优势:
- 集成 Cloudflare CLI、Better Auth CLI 和 Drizzle CLI,提高开发效率。
- 在开发和生产环境之间平滑切换。
- 使用脚本以一致的方式应用变更。
可以根据工作流程添加自定义脚本,扩展此配置。例如:
{
"scripts": {
"dev": "wrangler dev",
"deploy": "pnpm run cf-gen-types && wrangler secret bulk .dev.vars.production && wrangler deploy --minify",
"cf-gen-types": "wrangler types --env-interface CloudflareBindings",
"better-auth-gen-schema": "pnpm dlx @better-auth/cli@latest generate --config ./better-auth.config.ts --output ./src/db/schema.ts"
},
}注意:
有关高级用法和最新选项,请参阅各工具的官方 CLI 文档:
结语
现在,你已拥有一个在 Cloudflare Workers 上运行的轻量、快速、全面的身份验证服务。通过服务绑定,此配置支持以极低延迟构建基于微服务的架构。
本指南仅展示一个基础示例。对于 OAuth 或速率限制等高级场景,请参阅官方文档,根据服务需求调整配置。
完整示例源码可在这里找到:
GitHub 仓库