Nitro 集成

Better Auth可以与Nitro 应用(一个用于构建网络服务器的开源框架)集成。

本文旨在帮助你通过几个简单的步骤将 Better Auth 与你的 Nitro 应用集成。

创建新的 Nitro 应用

首先使用以下命令搭建一个新的 Nitro 应用:

Terminal
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 文件:

Terminal
npx prisma init

现在你可以用以下内容替换 schema.prisma 文件的内容:

prisma/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 客户端并同步数据库:

Terminal
npx prisma db push

安装并配置 Better Auth

按照安装指南中的步骤 1 和 2 在你的 Nitro 应用中安装 Better Auth 并设置环境变量。

完成后,在 server/utils/auth.ts 文件中创建你的 Better Auth 实例。

server/utils/auth.ts
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 Schema

使用 Better Auth CLI 通过运行以下命令用所需的模型更新你的 Prisma schema:

Terminal
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 文件中添加以下代码来实现:

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 并添加以下代码:

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 并添加以下代码来实现:

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;
};

现在你可以在路由中使用这个事件处理程序/中间件来保护它们:

server/routes/api/secret.get.ts
// 路由处理程序的对象语法
export default defineEventHandler({
  // 用户必须登录才能访问此路由
  onRequest: [requireAuth],
  handler: async (event) => {
    setResponseStatus(event, 201, "Secret data");
    return { message: "Secret data" };
  },
});

示例

你可以在这里找到一个集成了 Better Auth 和 Prisma 的 Nitro 应用示例。

On this page