安装
设置环境变量
在项目根目录下创建一个 .env
文件,并添加以下环境变量:
- 密钥
库用于加密和生成哈希的随机值。您可以使用下面的按钮生成一个,或者使用 openssl 等工具。
BETTER_AUTH_SECRET=
- 设置基础 URL
BETTER_AUTH_URL=http://localhost:3000 # 您应用的基础 URL
创建 Better Auth 实例
在以下位置之一创建一个名为 auth.ts
的文件:
- 项目根目录
lib/
文件夹utils/
文件夹
您也可以将这些文件夹嵌套在 src/
、app/
或 server/
文件夹下(例如 src/lib/auth.ts
、app/lib/auth.ts
)。
在此文件中,导入 Better Auth 并创建您的 auth 实例。确保使用变量名 auth
或作为 default
导出方式导出 auth 实例。
import { betterAuth } from "better-auth";
export const auth = betterAuth({
//...
});
配置数据库
Better Auth 需要一个数据库来存储用户数据。 您可以轻松配置 Better Auth 使用 SQLite、PostgreSQL 或 MySQL 等数据库!
import { betterAuth } from "better-auth";
import Database from "better-sqlite3";
export const auth = betterAuth({
database: new Database("./sqlite.db"),
})
import { betterAuth } from "better-auth";
import { Pool } from "pg";
export const auth = betterAuth({
database: new Pool({
// 连接选项
}),
})
import { betterAuth } from "better-auth";
import { createPool } from "mysql2/promise";
export const auth = betterAuth({
database: createPool({
// 连接选项
}),
})
或者,如果您更喜欢使用 ORM,可以使用内置的适配器之一。
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "@/db"; // 您的 Drizzle 实例
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "pg", // 或 "mysql", "sqlite"
}),
});
import { betterAuth } from "better-auth";
import { prismaAdapter } from "better-auth/adapters/prisma";
// 如果您的 Prisma 文件位于其他位置,可以更改路径
import { PrismaClient } from "@/generated/prisma";
const prisma = new PrismaClient();
export const auth = betterAuth({
database: prismaAdapter(prisma, {
provider: "sqlite", // 或 "mysql", "postgresql", ...等
}),
});
import { betterAuth } from "better-auth";
import { mongodbAdapter } from "better-auth/adapters/mongodb";
import { client } from "@/db"; // 您的 MongoDB 客户端
export const auth = betterAuth({
database: mongodbAdapter(client),
});
如果您的数据库不在上述列表中,请查看我们支持的其他 数据库 获取更多信息, 或使用支持的 ORM 之一。
创建数据库表
Better Auth 包含一个 CLI 工具来帮助管理库所需的模式。
- Generate:此命令生成 ORM 模式或 SQL 迁移文件。
如果您使用 Kysely,可以通过下面的 migrate
命令直接应用迁移。只有在计划手动应用迁移时才使用 generate
。
npx @better-auth/cli generate
- Migrate:此命令直接在数据库中创建所需的表。(仅适用于内置的 Kysely 适配器)
npx @better-auth/cli migrate
有关更多信息,请参阅 CLI 文档。
如果您希望手动创建模式,可以在 数据库部分 找到所需的核心模式。
认证方法
配置您想要使用的认证方法。Better Auth 内置支持邮箱/密码认证以及社交登录提供商。
import { betterAuth } from "better-auth";
export const auth = betterAuth({
//...其他选项
emailAndPassword: {
enabled: true,
},
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID as string,
clientSecret: process.env.GITHUB_CLIENT_SECRET as string,
},
},
});
您还可以通过插件使用更多认证方法,例如 Passkey(通行密钥)、用户名、Magic Link(魔法链接) 等。
挂载处理程序
要处理 API 请求,您需要在服务器上设置一个路由处理程序。
在您框架指定的全捕获路由处理程序中创建一个新文件或路由。此路由应处理路径为 /api/auth/*
的请求(除非您配置了不同的基础路径)。
Better Auth 支持任何具有标准 Request 和 Response 对象的后端框架,并为流行的框架提供辅助函数。
import { auth } from "@/lib/auth"; // 指向您的 auth 文件的路径
import { toNextJsHandler } from "better-auth/next-js";
export const { POST, GET } = toNextJsHandler(auth);
import { auth } from "~/utils/auth"; // 指向您的 auth 文件的路径
export default defineEventHandler((event) => {
return auth.handler(toWebRequest(event));
});
import { auth } from "$lib/auth"; // 指向您的 auth 文件的路径
import { svelteKitHandler } from "better-auth/svelte-kit";
import { building } from '$app/environment'
export async function handle({ event, resolve }) {
return svelteKitHandler({ event, resolve, auth, building });
}
import { auth } from '~/lib/auth.server' // 请根据需要调整路径
import type { LoaderFunctionArgs, ActionFunctionArgs } from "@remix-run/node"
export async function loader({ request }: LoaderFunctionArgs) {
return auth.handler(request)
}
export async function action({ request }: ActionFunctionArgs) {
return auth.handler(request)
}
import { auth } from "~/lib/auth"; // 指向您的 auth 文件的路径
import { toSolidStartHandler } from "better-auth/solid-start";
export const { GET, POST } = toSolidStartHandler(auth);
import { Hono } from "hono";
import { auth } from "./auth"; // 指向您的 auth 文件的路径
import { serve } from "@hono/node-server";
import { cors } from "hono/cors";
const app = new Hono();
app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw));
serve(app);
ExpressJS v5 通过切换到 path-to-regexp@6
引入了对路由路径匹配的破坏性更改。像 *
这样的通配符路由现在应使用新的命名语法编写,例如 /{*any}
,以正确捕获全捕获模式。这确保了跨路由场景的兼容性和可预测的行为。
详情请参阅 Express v5 迁移指南。
因此,在 ExpressJS v5 中的实现应如下所示:
app.all('/api/auth/{*any}', toNodeHandler(auth));
名称 any 是任意的,可以用您喜欢的任何标识符替换。
import express from "express";
import { toNodeHandler } from "better-auth/node";
import { auth } from "./auth";
const app = express();
const port = 8000;
app.all("/api/auth/*", toNodeHandler(auth));
// 在 Better Auth 处理程序之后挂载 express json 中间件
// 或仅将其应用于不与 Better Auth 交互的路由
app.use(express.json());
app.listen(port, () => {
console.log(`Better Auth app listening on port ${port}`);
});
这也适用于任何其他 Node 服务器框架,如 express、fastify、hapi 等,但可能需要一些修改。请参阅 fastify 指南。注意,不支持 CommonJS (cjs)。
import type { APIRoute } from "astro";
import { auth } from "@/auth"; // 指向您的 auth 文件的路径
export const GET: APIRoute = async (ctx) => {
return auth.handler(ctx.request);
};
export const POST: APIRoute = async (ctx) => {
return auth.handler(ctx.request);
};
import { Elysia, Context } from "elysia";
import { auth } from "./auth";
const betterAuthView = (context: Context) => {
const BETTER_AUTH_ACCEPT_METHODS = ["POST", "GET"]
// 验证请求方法
if(BETTER_AUTH_ACCEPT_METHODS.includes(context.request.method)) {
return auth.handler(context.request);
} else {
context.error(405)
}
}
const app = new Elysia().all("/api/auth/*", betterAuthView).listen(3000);
console.log(
`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`
);
import { auth } from '~/lib/server/auth'
import { createServerFileRoute } from '@tanstack/react-start/server'
export const ServerRoute = createServerFileRoute('/api/auth/$').methods({
GET: ({ request }) => {
return auth.handler(request)
},
POST: ({ request }) => {
return auth.handler(request)
},
});
import { auth } from '@/lib/server/auth'; // 指向您的 auth 文件的路径
const handler = auth.handler;
export { handler as GET, handler as POST };
创建客户端实例
客户端库可帮助您与身份验证服务器进行交互。Better Auth 为所有流行的 Web 框架提供了客户端支持,包括原生 JavaScript。
- 从适用于您框架的包中导入
createAuthClient
(例如,React 使用 "better-auth/react")。 - 调用该函数来创建您的客户端。
- 传递您身份验证服务器的基本 URL。(如果身份验证服务器与客户端运行在同一域名下,可以跳过此步骤。)
如果您使用的不是默认的 /api/auth
路径,请确保传递包含完整路径的整个 URL。(例如
http://localhost:3000/custom-path/auth
)
import { createAuthClient } from "better-auth/client"
export const authClient = createAuthClient({
/** 服务器的基本 URL(如果使用相同域名则为可选) */
baseURL: "http://localhost:3000"
})
import { createAuthClient } from "better-auth/react"
export const authClient = createAuthClient({
/** 服务器的基本 URL(如果使用相同域名则为可选) */
baseURL: "http://localhost:3000"
})
import { createAuthClient } from "better-auth/vue"
export const authClient = createAuthClient({
/** 服务器的基本 URL(如果使用相同域名则为可选) */
baseURL: "http://localhost:3000"
})
import { createAuthClient } from "better-auth/svelte"
export const authClient = createAuthClient({
/** 服务器的基本 URL(如果使用相同域名则为可选) */
baseURL: "http://localhost:3000"
})
import { createAuthClient } from "better-auth/solid"
export const authClient = createAuthClient({
/** 服务器的基本 URL(如果使用相同域名则为可选) */
baseURL: "http://localhost:3000"
})
提示:您也可以根据需要导出特定的方法:
export const { signIn, signUp, useSession } = createAuthClient()