从 NextAuth.js 迁移到 Better Auth
在本指南中,我们将逐步介绍如何将项目从 NextAuth.js 迁移到 Better Auth,确保不丢失数据或功能。虽然本指南重点针对 Next.js,但也可以适应其他框架。
在开始之前
在开始迁移过程之前,在您的项目中设置 Better Auth。请按照 安装指南 开始。
映射现有列
与其更改现有的数据库列名,您可以映射它们以匹配 Better Auth 的预期结构。这允许您保留当前的数据库架构。
用户架构
映射用户架构中的以下字段:
- (next-auth v4)
emailVerified: datetime → boolean
会话架构
映射会话架构中的以下字段:
expires→expiresAtsessionToken→token- (next-auth v4) add
createdAtwith datetime type - (next-auth v4) add
updatedAtwith datetime type
export const auth = betterAuth({
// 其他配置
session: {
fields: {
expiresAt: "expires", // 将您现有的 `expires` 字段映射到 Better Auth 的 `expiresAt`
token: "sessionToken" // 将您现有的 `sessionToken` 字段映射到 Better Auth 的 `token`
}
},
});确保您的会话架构具有 createdAt 和 updatedAt 字段。
账户架构
映射账户架构中的这些字段:
- (next-auth v4)
provider→providerId providerAccountId→accountIdrefresh_token→refreshTokenaccess_token→accessToken- (next-auth v3)
access_token_expires→accessTokenExpiresAtand int → datetime - (next-auth v4)
expires_at→accessTokenExpiresAtand int → datetime id_token→idToken- (next-auth v4) add
createdAtwith datetime type - (next-auth v4) add
updatedAtwith datetime type
移除 session_state、type 和 token_type 字段,因为 Better Auth 不需要它们。
export const auth = betterAuth({
// 其他配置
account: {
fields: {
accountId: "providerAccountId",
refreshToken: "refresh_token",
accessToken: "access_token",
accessTokenExpiresAt: "access_token_expires",
idToken: "id_token",
}
},
});注意: 如果您使用 ORM 适配器,可以在您的架构文件中映射这些字段。
Prisma 示例:
model Session {
id String @id @default(cuid())
expiresAt DateTime @map("expires") // 将您现有的 `expires` 字段映射到 Better Auth 的 `expiresAt`
token String @map("sessionToken") // 将您现有的 `sessionToken` 字段映射到 Better Auth 的 `token`
userId String
user User @relation(fields: [userId], references: [id])
}确保您的账户架构具有 createdAt 和 updatedAt 字段。
更新路由处理程序
在 app/api/auth 文件夹中,将 [...nextauth] 文件重命名为 [...all] 以避免混淆。然后,按照以下方式更新 route.ts 文件:
import { toNextJsHandler } from "better-auth/next-js";
import { auth } from "~/server/auth";
export const { POST, GET } = toNextJsHandler(auth);更新客户端
在 lib 文件夹中创建一个名为 auth-client.ts 的文件。添加以下代码:
import { createAuthClient } from "better-auth/react";
export const authClient = createAuthClient({
baseURL: process.env.BASE_URL! // 如果 API 基础 URL 与前端匹配,则可选
});
export const { signIn, signOut, useSession } = authClient;社交登录函数
更新您的社交登录函数以使用 Better Auth。例如,对于 Discord:
import { signIn } from "~/lib/auth-client";
export const signInDiscord = async () => {
const data = await signIn.social({
provider: "discord"
});
return data;
};更新 useSession 调用
用 Better Auth 的版本替换 useSession 调用。示例:
import { useSession } from "~/lib/auth-client";
export const Profile = () => {
const { data } = useSession();
return (
<div>
<pre>
{JSON.stringify(data, null, 2)}
</pre>
</div>
);
};服务器端会话处理
在服务器上使用 auth 实例获取会话数据:
"use server";
import { auth } from "~/server/auth";
import { headers } from "next/headers";
export const protectedAction = async () => {
const session = await auth.api.getSession({
headers: await headers(),
});
};中间件
要使用中间件保护路由,请参考 Next.js 中间件指南。
收尾
恭喜!您已成功从 NextAuth.js 迁移到 Better Auth。要实现带有多种认证方法的完整实现,请查看 演示仓库。
Better Auth 提供更大的灵活性和更多功能——请务必探索 文档 以充分发挥其潜力。