Cloudflare 上での Better Auth
Cloudflare Workers 向けに最適化された、TypeScript ベースの軽量な認証サービス
技術スタックの概要
🔥 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 dev を実行できるように、process.env を正しく読み取れる Wrangler の設定になっていることを確認してください。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 リポジトリ