⚠️ 重要提示:NextAuth.js v5仍处于测试阶段。生产环境应用需谨慎测试。
# 检查当前NextAuth版本
npm list next-auth
# 示例项目使用版本
"next-auth": "^4.24.7"npm uninstall next-auth
npm uninstall @next-auth/prisma-adapter # 如果使用Prismanpm install next-auth@beta
npm install @auth/prisma-adapter # 新版Prisma适配器{
"dependencies": {
"next-auth": "5.0.0-beta.25",
"@auth/prisma-adapter": "^2.6.0",
"prisma": "^5.22.0",
"@prisma/client": "^5.22.0"
}
}// pages/api/auth/[...nextauth].ts
import NextAuth from 'next-auth'
import GoogleProvider from 'next-auth/providers/google'
import CredentialsProvider from 'next-auth/providers/credentials'
import { PrismaAdapter } from '@next-auth/prisma-adapter'
import { prisma } from '@/lib/prisma'
import bcrypt from 'bcryptjs'
export default NextAuth({
adapter: PrismaAdapter(prisma),
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
// ...其他配置
]
})// app/api/auth/[...nextauth]/route.ts
import NextAuth from 'next-auth'
import Google from 'next-auth/providers/google'
import Credentials from 'next-auth/providers/credentials'
import { PrismaAdapter } from '@auth/prisma-adapter'
import { prisma } from '@/lib/prisma'
import bcrypt from 'bcryptjs'
const handler = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [
Google({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
// ...其他配置
]
});
export { handler as GET, handler as POST }# .env.local
# v5使用AUTH_SECRET替代NEXTAUTH_SECRET
AUTH_SECRET=your-secret-key-here
AUTH_URL=http://localhost:3000
# Google OAuth (保持不变)
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret// types/auth.d.ts
import { DefaultSession } from 'next-auth'
declare module 'next-auth' {
interface Session {
user: {
id: string
roleId: number
} & DefaultSession['user']
}
interface User {
roleId?: number // OAuth用户设为可选
}
}// app/layout.tsx
import { SessionProvider } from 'next-auth/react'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>
<SessionProvider>{children}</SessionProvider>
</body>
</html>
)
}// lib/auth.ts
import NextAuth from 'next-auth'
import Google from 'next-auth/providers/google'
import { PrismaAdapter } from '@auth/prisma-adapter'
import { prisma } from '@/lib/prisma'
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [
Google({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
],
// ...其他配置
})import { auth } from '@/lib/auth'
import { NextResponse } from 'next/server'
export default auth((req) => {
const { nextUrl } = req
const isLoggedIn = !!req.auth
// 保护管理员路由
if (nextUrl.pathname.startsWith('/admin')) {
if (!isLoggedIn || req.auth?.user?.roleId !== 4) {
return NextResponse.redirect(new URL('/auth/signin', nextUrl))
}
}
return NextResponse.next()
})model Account {
id String @id @default(cuid())
userId String @map("user_id")
type String
provider String
providerAccountId String @map("provider_account_id")
// ...其他字段
}
model Session {
id String @id @default(cuid())
sessionToken String @unique @map("session_token")
userId String @map("user_id")
expires DateTime
// ...其他关系
}
model User {
id String @id @default(cuid())
name String?
email String @unique
password String? // 凭证验证使用
emailVerified DateTime? @map("email_verified")
// ...其他字段
}// test/auth.test.ts
import { describe, it, expect } from 'vitest'
import { auth } from '@/lib/auth'
describe('NextAuth v5迁移测试', () => {
it('应处理OAuth登录', async () => {
// 测试OAuth流程
})
// ...其他测试用例
})解决方案:使用JWT策略
export const { handlers, auth } = NextAuth({
session: { strategy: 'jwt' }, // 凭证验证必需
providers: [
Credentials({
// ...凭证配置
}),
],
})迁移后典型改进:
NextAuth.js v5迁移需要仔细规划但能带来显著优势。关键在于全面测试和理解破坏性变更。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。