Nitro 集成

将 Better Auth 集成到 Nitro 中。

Better Auth 可以集成到你的 Nitro 应用程序(一个用于构建 Web 服务器的开源框架)中。

本指南旨在帮助你通过几个简单步骤,将 Better Auth 集成到你的 Nitro 应用中。

创建新的 Nitro 应用

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

Terminal
npx create-nitro-app

此命令将创建 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 文件:

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,指向你的数据库位置。

.env
DATABASE_URL="file:./dev.db"

运行以下命令生成 Prisma 客户端并同步数据库:

终端
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 default betterAuth({
  database: prismaAdapter(prisma, { provider: "sqlite" }),
  emailAndPassword: { enabled: true },
});

更新 Prisma Schema

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

终端
npx auth generate --config server/utils/auth.ts

--config 选项用于指定你创建 Better Auth 实例的文件路径。

然后前往 prisma/schema.prisma 文件并保存,以触发自动格式化。

保存后,你可以运行 npx prisma db push 命令更新数据库 schema。

挂载处理器

现在,你可以在 Nitro 应用中挂载 Better Auth 处理器。你可以将以下代码添加到 server/api/auth/[...all].ts 文件中:

server/api/auth/[...all].ts
import auth from "~/server/utils/auth";

export default auth;

这是一个 catch-all 路由,将处理所有请求路径为 /api/auth/*。

CORS

你可以在 nitro.config.ts 中使用 路由规则 为 Nitro 应用配置 CORS:

nitro.config.ts
import { defineConfig } from "nitro";

export default defineConfig({
  routeRules: {
    "/api/auth/**": {
      cors: {
        origin: ["http://localhost:3000"],
        credentials: true,
      },
    },
  },
});

如果你使用基于 cookie 的会话,请设置 credentials: true,并在 origin 中列出前端的确切来源。通配符来源(cors: true)不能与凭据结合使用。如果你只使用 bearer token,则无需设置 credentials。请确保该配置与前端应用保持同步。

有关 CORS 的更多信息,请参阅 Nitro 文档。

认证守卫/中间件

你可以在 Nitro 应用中添加认证守卫以保护需要认证的路由。方法是创建新文件 server/utils/require-auth.ts,并添加以下代码:

server/utils/require-auth.ts
import { defineHandler, HTTPError } from "nitro";
import auth from "~/server/utils/auth.ts";

/**
 * Middleware for requiring authentication on routes.
 *
 * Can be extended to check specific roles or permissions.
 */
export default defineHandler(async (event) => {
  const session = await auth.api.getSession({
    headers: event.req.headers,
  });

  if (!session) {
    throw HTTPError.status(401, "Unauthorized");
  }

  // You can save the session to the event context for later use
  event.context.auth = session;
});

现在,你可以使用对象语法事件处理器将中间件应用于特定路由:

server/api/secret.get.ts
import { defineHandler } from "nitro";
import requireAuth from "~/server/utils/require-auth.ts";

export default defineHandler({
  middleware: [requireAuth],
  handler: () =>
    Response.json(
      { message: "Secret data" },
      { status: 201, statusText: "Secret data" },
    ),
});

示例

查看一个 集成了 Better Auth 和 Prisma 的 Nitro 应用示例。