lobehub/docs/self-hosting/advanced/auth/nextauth-to-betterauth.zh-CN.mdx
2026-01-23 23:57:08 +08:00

323 lines
12 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 从 NextAuth 迁移到 Better Auth
description: 将 LobeChat 部署从 NextAuth 身份验证迁移到 Better Auth 的指南,包括简单迁移和完整迁移选项。
tags:
- 身份验证服务
- Better Auth
- NextAuth
- 迁移
---
# 从 NextAuth 迁移到 Better Auth
本指南帮助您将现有的基于 NextAuth 的 LobeChat 部署迁移到 Better Auth。
<Callout type={'info'}>
Better Auth 是 LobeChat 推荐的身份验证解决方案。它提供更简单的配置、更多的 SSO 提供商支持,以及更好的自托管体验。
</Callout>
<Callout type={'error'}>
**重要提醒**
- **务必先备份数据库**!如使用 Neon可通过 [Fork 分支](https://neon.tech/docs/manage/branches#create-a-branch) 创建备份
- 迁移过程中可能出现的任何数据丢失或问题LobeChat 概不负责
- 本指南适合有一定开发背景的用户,不建议无技术经验的用户自行操作
- 如有任何疑问,欢迎到 [Discord](https://discord.com/invite/AYFPHvv2jT) 社区或 [GitHub Issue](https://github.com/lobehub/lobe-chat/issues) 提问
</Callout>
## 选择迁移方式
| 方式 | 适用场景 | 用户影响 | 数据保留 |
| ------------- | ------------- | ------- | ------------- |
| [简单迁移](#简单迁移) | 小型部署(≤ 10 用户) | 用户需重新登录 | 聊天记录、设置 |
| [完整迁移](#完整迁移) | 大型部署 | 对用户无感知 | 全部数据包括 SSO 连接 |
<Callout type={'info'}>
**注意**NextAuth 从未支持邮箱密码登录,因此没有密码哈希需要迁移。完整迁移的主要好处是保留 SSO 连接Google、GitHub 等)。
</Callout>
## 环境变量迁移对照表
### 通用变量
| NextAuth (旧) | Better Auth (新) | 说明 |
| -------------------------------- | -------------------- | ---------------------------- |
| `NEXT_PUBLIC_ENABLE_NEXT_AUTH` | *(已废弃)* | 不再需要Better Auth 在配置数据库后自动启用 |
| `NEXT_AUTH_SECRET` | `AUTH_SECRET` | 会话加密密钥 |
| `AUTH_URL` | `APP_URL` | 应用 URL用于 OAuth 回调) |
| `NEXT_AUTH_SSO_PROVIDERS` | `AUTH_SSO_PROVIDERS` | SSO 提供商列表(逗号分隔) |
| `NEXT_AUTH_SSO_SESSION_STRATEGY` | *(已废弃)* | 不再需要Better Auth 使用数据库会话 |
### SSO 提供商变量
SSO 提供商的环境变量格式保持一致:`AUTH_<PROVIDER>_ID` 和 `AUTH_<PROVIDER>_SECRET`。
| NextAuth (旧) | Better Auth (新) | 说明 |
| -------------------------------- | ----------------------- | ---------------- |
| `AUTH_GITHUB_ID` | `AUTH_GITHUB_ID` | ✅ 保持不变 |
| `AUTH_GITHUB_SECRET` | `AUTH_GITHUB_SECRET` | ✅ 保持不变 |
| `AUTH_GOOGLE_ID` | `AUTH_GOOGLE_ID` | ✅ 保持不变 |
| `AUTH_GOOGLE_SECRET` | `AUTH_GOOGLE_SECRET` | ✅ 保持不变 |
| `AUTH_AUTH0_ID` | `AUTH_AUTH0_ID` | ✅ 保持不变 |
| `AUTH_AUTH0_SECRET` | `AUTH_AUTH0_SECRET` | ✅ 保持不变 |
| `AUTH_AUTH0_ISSUER` | `AUTH_AUTH0_ISSUER` | ✅ 保持不变 |
| `AUTH_AUTHENTIK_ID` | `AUTH_AUTHENTIK_ID` | ✅ 保持不变 |
| `AUTH_AUTHENTIK_SECRET` | `AUTH_AUTHENTIK_SECRET` | ✅ 保持不变 |
| `AUTH_AUTHENTIK_ISSUER` | `AUTH_AUTHENTIK_ISSUER` | ✅ 保持不变 |
| `microsoft-entra-id` | `microsoft` | ⚠️ provider 名称变更 |
| `AUTH_MICROSOFT_ENTRA_ID_ID` | `AUTH_MICROSOFT_ID` | ⚠️ 变量名变更 |
| `AUTH_MICROSOFT_ENTRA_ID_SECRET` | `AUTH_MICROSOFT_SECRET` | ⚠️ 变量名变更 |
<Callout type={'warning'}>
**注意**Microsoft Entra ID 的 provider 名称从 `microsoft-entra-id` 改为 `microsoft`,相应的环境变量前缀也从 `AUTH_MICROSOFT_ENTRA_ID_` 改为 `AUTH_MICROSOFT_`。
</Callout>
### 新增功能变量
Better Auth 支持更多功能,以下是新增的环境变量:
| 环境变量 | 说明 |
| ------------------------- | -------------------------------- |
| `AUTH_ALLOWED_EMAILS` | 邮箱白名单(限制注册) |
| `AUTH_EMAIL_VERIFICATION` | 启用邮箱验证(设为 `1` |
| `ENABLE_MAGIC_LINK` | 启用魔法链接登录(设为 `1` |
| `EMAIL_SERVICE_PROVIDER` | 邮件服务提供商(`nodemailer` 或 `resend` |
## 简单迁移
对于小型自托管部署,最简单的方法是让用户使用 SSO 账户重新登录。
<Callout type={'warning'}>
**限制**:此方法会丢失 SSO 连接数据。如需保留 SSO 连接,请使用 [完整迁移](#完整迁移)。
虽然 SSO 连接会丢失,但用户可以在登录后通过个人资料页手动重新绑定社交账号。
**示例场景**:假设你之前的账户绑定了两个 SSO 账户:
- 主邮箱Google`mail1@google.com`
- 副邮箱Microsoft`mail2@outlook.com`
迁移后使用 `mail2@outlook.com` 登录将会**创建新用户**,而非关联到原有账户。
</Callout>
### 步骤
1. **更新环境变量**
移除 NextAuth 变量并添加 Better Auth 变量:
```bash
# 移除这些
# NEXT_AUTH_SECRET=xxx
# AUTH_xxx 相关的 NextAuth 提供商配置
# 添加这些
AUTH_SECRET=your-secret-key # openssl rand -base64 32
# 可选:启用 Google SSO示例
AUTH_SSO_PROVIDERS=google
AUTH_GOOGLE_ID=your-google-client-id
AUTH_GOOGLE_SECRET=your-google-client-secret
```
<Callout type={'tip'}>
查阅 [身份验证服务配置](/zh/docs/self-hosting/advanced/auth) 了解完整的环境变量和 SSO 提供商配置。
</Callout>
2. **重新部署 LobeChat**
部署启用 Better Auth 的新版本。
3. **通知用户**
告知用户使用之前的 SSO 账户重新登录。由于用户 ID 保持不变,聊天记录和设置将被保留。
<Callout type={'tip'}>
这种方法快速且配置简单。用户只需使用现有的 SSO 提供商重新登录即可。
</Callout>
## 完整迁移
对于大型部署或需要保留 SSO 连接的情况,请使用迁移脚本。这会将数据从 `nextauth_accounts` 表迁移到 Better Auth 的 `accounts` 表。
<Callout type={'error'}>
**重要说明**
- **务必先备份数据库**!如使用 Neon可通过 [Fork 分支](https://neon.tech/docs/manage/branches#create-a-branch) 创建备份
- 迁移脚本需要 **clone 仓库后在本地运行**,不是在部署环境中执行
- 由于迁移涉及用户数据,风险较高,**官方不提供部署时自动迁移功能**
- 请务必先使用 dry-run 模式测试脚本能够顺利运行再正式执行
- 请务必在测试环境验证后再操作生产数据库
</Callout>
### 前置条件
**环境要求:**
- Node.js 18+
- Git用于 clone 仓库)
- pnpm用于安装依赖
**准备工作:**
1. Clone LobeChat 仓库并安装依赖:
```bash
git clone https://github.com/lobehub/lobe-chat.git
cd lobe-chat
pnpm install
```
2. 准备数据库连接字符串
3. 确保数据库 schema 为最新版本
<Callout type={'info'}>
如果你长期停留在旧版本,数据库 schema 可能不是最新的。请在 clone 的仓库中运行:
```bash
DATABASE_URL=your-database-url pnpm db:migrate
```
</Callout>
### 步骤 1配置迁移脚本环境变量
在项目根目录创建 `.env` 文件(脚本会自动加载),配置所有环境变量:
```bash
# ============================================
# 迁移模式test 或 prod
# 建议先用 test 模式在测试数据库验证,确认无误后再切换到 prod
# ============================================
NEXTAUTH_TO_BETTERAUTH_MODE=test
# ============================================
# 数据库连接(根据模式使用对应的环境变量)
# TEST_ 前缀用于测试环境PROD_ 前缀用于生产环境
# ============================================
TEST_NEXTAUTH_TO_BETTERAUTH_DATABASE_URL=postgresql://user:pass@test-host:5432/testdb
PROD_NEXTAUTH_TO_BETTERAUTH_DATABASE_URL=postgresql://user:pass@prod-host:5432/proddb
# ============================================
# 数据库驱动(可选)
# neon: Neon serverless 驱动(默认)
# node: node-postgres 驱动
# ============================================
NEXTAUTH_TO_BETTERAUTH_DATABASE_DRIVER=neon
# ============================================
# 批处理大小(可选)
# 每批处理的记录数,默认为 300
# ============================================
NEXTAUTH_TO_BETTERAUTH_BATCH_SIZE=300
# ============================================
# Dry Run 模式(可选)
# 设为 1 时只打印日志,不实际修改数据库
# 建议首次运行时启用,验证无误后再关闭
# ============================================
NEXTAUTH_TO_BETTERAUTH_DRY_RUN=1
```
### 步骤 2Dry-Run 验证(测试环境)
```bash
# 运行迁移NEXTAUTH_TO_BETTERAUTH_DRY_RUN=1只打印日志不修改数据库
npx tsx scripts/nextauth-to-betterauth/index.ts
```
检查输出日志,确认无异常后继续下一步。
### 步骤 3执行迁移并验证测试环境
修改 `.env` 将 `NEXTAUTH_TO_BETTERAUTH_DRY_RUN` 改为 `0`,然后执行:
```bash
# 执行迁移
npx tsx scripts/nextauth-to-betterauth/index.ts
# 验证迁移结果
npx tsx scripts/nextauth-to-betterauth/verify.ts
```
验证测试环境迁移结果无误后,继续下一步。
### 步骤 4Dry-Run 验证(生产环境)
1. 修改 `.env` 文件:
- 将 `NEXTAUTH_TO_BETTERAUTH_MODE` 改为 `prod`
- 将 `NEXTAUTH_TO_BETTERAUTH_DRY_RUN` 改回 `1`
2. 运行脚本:
```bash
# 运行迁移dry-run 模式验证)
npx tsx scripts/nextauth-to-betterauth/index.ts
```
检查输出日志,确认无异常后继续下一步。
### 步骤 5执行迁移并验证生产环境
修改 `.env` 将 `NEXTAUTH_TO_BETTERAUTH_DRY_RUN` 改为 `0`,然后执行:
```bash
# 执行迁移
npx tsx scripts/nextauth-to-betterauth/index.ts
# 验证迁移结果
npx tsx scripts/nextauth-to-betterauth/verify.ts
```
### 步骤 6配置 Better Auth 并重新部署
迁移完成后,参照 [简单迁移 - 步骤 1](#步骤) 配置 Better Auth 环境变量并重新部署。
<Callout type={'tip'}>
完整的 Better Auth 配置请参阅 [身份验证服务配置](/zh/docs/self-hosting/advanced/auth),包括所有支持的 SSO 提供商和邮件服务配置。
</Callout>
## 迁移内容对比
| 数据 | 简单迁移 | 完整迁移 |
| ----------------------- | --------- | ---- |
| 用户账户 | ✅(通过重新登录) | ✅ |
| SSO 连接Google、GitHub 等) | ❌ | ✅ |
| 聊天记录 | ✅ | ✅ |
| 用户设置 | ✅ | ✅ |
<Callout type={'info'}>
**注意**Sessions 和 verification tokens 不会被迁移,因为它们是临时数据。迁移后用户需要重新登录。
</Callout>
## 常见问题
### 迁移后用户无法登录
- 检查 `AUTH_SECRET` 是否正确设置
- 验证数据库连接是否正常
- 确保 SSO 提供商已在 `AUTH_SSO_PROVIDERS` 中配置
### SSO 用户无法连接
- 简单迁移:用户需要使用 SSO 账户重新登录
- 完整迁移:验证 SSO 提供商已在 `AUTH_SSO_PROVIDERS` 中配置,且使用相同的 provider ID
### 迁移脚本失败
- 检查数据库连接字符串
- 查看脚本日志了解具体错误
- 确保数据库中存在 `nextauth_accounts` 表
### column "xxx" of relation "users" does not exist
这是因为数据库 schema 未更新。请先运行 `pnpm db:migrate` 更新数据库结构,然后再执行迁移脚本。
## 相关阅读
<Cards>
<Card href={'/zh/docs/self-hosting/advanced/auth'} title={'身份验证服务配置'} />
<Card href={'/zh/docs/self-hosting/environment-variables/auth'} title={'认证相关环境变量'} />
<Card href={'/zh/docs/self-hosting/advanced/auth/legacy'} title={'旧版身份验证NextAuth 和 Clerk'} />
</Cards>