# Nitro 集成 (/docs/integrations/nitro)

将 Better Auth 集成到 Nitro 中。



Better Auth 可以集成到你的 [Nitro 应用程序](https://nitro.build/)（一个用于构建 Web 服务器的开源框架）中。

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

## 创建新的 Nitro 应用 [#创建新的-nitro-应用]

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

```bash title="Terminal"
npx create-nitro-app
```

此命令将创建 `nitro-app` 目录并安装所有依赖。你现在可以在代码编辑器中打开 `nitro-app` 目录。

### Prisma 适配器设置 [#prisma-适配器设置]

<Callout>
  本指南假设你对 Prisma 有基本的了解。如果你刚接触 Prisma，可以查看 [Prisma 文档](https://www.prisma.io/docs/getting-started)。

  本指南中使用的 `sqlite` 数据库不适用于生产环境。你应当将其替换为适合生产的数据库，如 `PostgreSQL`。
</Callout>

本指南中，我们将使用 Prisma 适配器。你可以通过以下命令安装 Prisma 客户端：

<CodeBlockTabs defaultValue="npm" groupId="persist-install">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @prisma/client
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @prisma/client
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @prisma/client
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @prisma/client
    ```
  </CodeBlockTab>
</CodeBlockTabs>

`prisma` 可以作为开发依赖安装，命令如下：

<CodeBlockTabs defaultValue="npm" groupId="persist-install">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install -D prisma
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add -D prisma
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add --dev prisma
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add --dev prisma
    ```
  </CodeBlockTab>
</CodeBlockTabs>

通过运行以下命令生成 `prisma` 目录中的 `schema.prisma` 文件：

```bash title="终端"
npx prisma init
```

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

```prisma title="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`，指向你的数据库位置。

```txt title=".env"
DATABASE_URL="file:./dev.db"
```

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

```bash title="终端"
npx prisma db push
```

### 安装及配置 Better Auth [#安装及配置-better-auth]

按照 [安装指南](/docs/installation) 中的第 1 和第 2 步，在你的 Nitro 应用中安装 Better Auth 并设置环境变量。

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

```ts title="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 [#更新-prisma-schema]

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

```bash title="终端"
npx auth generate --config server/utils/auth.ts
```

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

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

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

## 挂载处理器 [#挂载处理器]

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

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

export default auth;
```

<Callout>
  这是一个 [catch-all](https://nitro.build/guide/routing#catch-all-route) 路由，将处理所有请求路径为 `/api/auth/*`。
</Callout>

### CORS [#cors]

你可以在 `nitro.config.ts` 中使用 [路由规则](https://nitro.build/docs/routing#cors) 为 Nitro 应用配置 CORS：

```ts title="nitro.config.ts"
import { defineConfig } from "nitro";

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

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

有关 CORS 的更多信息，请参阅 [Nitro 文档](https://nitro.build/docs/routing#cors)。

### 认证守卫/中间件 [#认证守卫中间件]

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

```ts title="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;
});

```

现在，你可以使用[对象语法事件处理器](https://h3.dev/guide/basics/handler#object-syntax)将中间件应用于特定路由：

```ts title="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 应用示例](https://github.com/BayBreezy/nitrojs-better-auth-prisma)。

