Nitro 集成
Better Auth 可以与您的 Nitro Application(一个用于构建 Web 服务器的开源框架)集成。
本指南旨在通过几个简单步骤帮助您将 Better Auth 集成到您的 Nitro 应用程序中。
创建新的 Nitro 应用程序
首先,使用以下命令搭建一个新的 Nitro 应用程序:
npx giget@latest nitro nitro-app --install
这将创建 nitro-app
目录并安装所有依赖项。您现在可以在代码编辑器中打开 nitro-app
目录。
Prisma 适配器设置
本指南假设您已对 Prisma 有基本了解。如果您是 Prisma 新手,可以查阅 Prisma 文档。
本指南中使用的 sqlite
数据库不适用于生产环境。您应将其替换为适用于生产环境的数据库,如 PostgreSQL
。
在本指南中,我们将使用 Prisma 适配器。您可以通过运行以下命令安装 Prisma 客户端:
npm install @prisma/client
可以使用以下命令将 prisma
安装为开发依赖项:
npm install -D prisma
通过运行以下命令,在 prisma
目录中生成 schema.prisma
文件:
npx prisma init
现在您可以将 schema.prisma
文件的内容替换为以下内容:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
// 将被删除。仅用于生成 Prisma 客户端
model Test {
id Int @id @default(autoincrement())
name String
}
请确保更新 .env
文件中的 DATABASE_URL
,使其指向您的数据库位置。
DATABASE_URL="file:./dev.db"
运行以下命令以生成 Prisma 客户端并同步数据库:
npx prisma db push
安装与配置 Better Auth
按照安装指南中的步骤 1 和 2,在您的 Nitro 应用中安装 Better Auth 并设置环境变量。
完成后,在 server/utils/auth.ts
文件中创建您的 Better Auth 实例。
import { betterAuth } from "better-auth";
import { prismaAdapter } from "better-auth/adapters/prisma";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
export const auth = betterAuth({
database: prismaAdapter(prisma, { provider: "sqlite" }),
emailAndPassword: { enabled: true },
});
更新 Prisma 架构
使用 Better Auth CLI 运行以下命令,使用所需的模型更新您的 Prisma 架构:
npx @better-auth/cli generate --config server/utils/auth.ts
--config
标志用于指定您创建 Better Auth 实例的文件路径。
前往 prisma/schema.prisma
文件并保存文件以触发保存时的格式化。
保存文件后,您可以运行 npx prisma db push
命令来更新数据库架构。
挂载处理程序
现在您可以在 Nitro 应用中挂载 Better Auth 处理程序。您可以通过将以下代码添加到 server/routes/api/auth/[...all].ts
文件中来实现:
export default defineEventHandler((event) => {
return auth.handler(toWebRequest(event));
});
这是一个通配路由,将处理所有对 /api/auth/*
的请求。
CORS(跨域资源共享)
你可以通过创建一个插件来为你的 Nitro 应用配置 CORS。
首先安装 cors 包:
npm install cors
现在你可以创建一个新文件 server/plugins/cors.ts
并添加以下代码:
import cors from "cors";
export default defineNitroPlugin((plugin) => {
plugin.h3App.use(
fromNodeMiddleware(
cors({
origin: "*",
}),
),
);
});
这将为所有路由启用 CORS。你可以自定义 origin
属性以允许来自特定域的请求。确保配置与你的前端应用程序保持同步。
身份验证守卫/中间件
你可以为 Nitro 应用程序添加身份验证守卫,以保护需要身份验证的路由。你可以通过创建一个新文件 server/utils/require-auth.ts
并添加以下代码来实现:
import { EventHandler, H3Event } from "h3";
import { fromNodeHeaders } from "better-auth/node";
/**
* 用于要求路由进行身份验证的中间件。
*
* 可以扩展以检查特定角色或权限。
*/
export const requireAuth: EventHandler = async (event: H3Event) => {
const headers = event.headers;
const session = await auth.api.getSession({
headers: headers,
});
if (!session)
throw createError({
statusCode: 401,
statusMessage: "Unauthorized",
});
// 你可以将会话保存到事件上下文中供后续使用
event.context.auth = session;
};
现在你可以在路由中使用这个事件处理器/中间件来保护它们:
// 路由处理器的对象语法
export default defineEventHandler({
// 用户必须登录才能访问此路由
onRequest: [requireAuth],
handler: async (event) => {
setResponseStatus(event, 201, "Secret data");
return { message: "Secret data" };
},
});
示例
您可以在此处找到一个集成了 Better Auth 和 Prisma 的 Nitro 应用程序示例。