升级Prisma Adapter后NextAuth Google登录无法跳转至首页问题
问题排查与解决建议
针对你遇到的「Prisma Adapter可正常写入数据库,但Google登录回调后跳回登录页」的问题,给出以下具体排查方向:
1. 检查Prisma Schema完整性
确保你的schema.prisma包含NextAuth要求的完整模型与关联关系,字段类型不能出错:
model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? accounts Account[] sessions Session[] } model Account { id String @id @default(cuid()) userId String type String provider String providerAccountId String refresh_token String? @db.Text access_token String? @db.Text expires_at Int? token_type String? scope String? id_token String? @db.Text session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) } model Session { id String @id @default(cuid()) sessionToken String @unique userId String expires DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model VerificationToken { identifier String token String @unique expires DateTime @@unique([identifier, token]) }
模型缺失或字段错误会直接导致Session验证失败,触发登录页重定向。
2. 显式配置Session策略与回调
在NextAuth配置中指定Session策略,并完善session回调确保用户标识正确传递:
export const options: NextAuthOptions = { debug: true, adapter: PrismaAdapter(prisma), // 使用Adapter时推荐显式指定database策略 session: { strategy: "database" }, callbacks: { async session({ session, user }) { // 将用户ID绑定到session,保证中间件能识别登录状态 session.user.id = user.id; return session; } }, providers: [ GoogleProvider({ clientId: process.env.GOOGLE_ID as string, clientSecret: process.env.GOOGLE_SECRET as string }), GitHubProvider({ clientId: process.env.GITHUB_ID as string, clientSecret: process.env.GITHUB_SECRET as string }), ], }
默认回调可能无法正确传递用户标识,导致中间件判定为未登录状态。
3. 调整中间件路由匹配规则
默认的next-auth/middleware会拦截所有路由,需确保回调路径不被误拦截,或显式指定保护范围:
// middleware.ts export { default } from "next-auth/middleware"; // 仅保护需要登录的页面,避免拦截回调与首页 export const config = { matcher: ["/dashboard/:path*", "/profile"], };
如果中间件误拦截了回调后的跳转路径,会直接触发登录页重定向。
4. 修复版本兼容性问题
@next-auth/prisma-adapter@1.0.7与Prisma 5.x存在兼容性问题,建议升级到最新版本:
npm install @next-auth/prisma-adapter@latest
升级后重新生成Prisma客户端:
npx prisma generate
5. 检查Session数据库记录
登录成功后查看Session表是否生成有效记录,确认expires字段为未来时间。若Session未被正确创建,后续验证会直接失败。
内容的提问来源于stack exchange,提问作者Abdelhak NASSEUR
相关产品推荐
相关产品推荐

