You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:26:06