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

Next-Auth授权异常:使用其他账号登录问题排查求助

问题分析与解决方案

你的问题核心在于JWT回调逻辑错误,导致登录时没有正确关联当前登录的用户,反而复用了旧的token信息,从而出现跨提供商登录到错误账号的情况。

问题代码分析

在jwt回调中,你错误地使用token.id去查询用户:

const candidate = await prisma.user.findFirst({ where: { id: token.id as string } })

当用户通过新提供商登录时,若旧token仍存在(或逻辑复用),token.id指向的是之前登录的用户ID,查询后返回旧用户信息,最终导致session被设置为旧账号。

而且该逻辑完全冗余——登录时user参数已经是当前登录的用户(无论是新创建还是数据库中关联的用户),无需额外查询。

修改后的authOptions配置

adapter: PrismaAdapter(prisma),
session: {
    strategy: "jwt"
},
pages: {
    signIn: "/login",
},
secret: process.env.NEXTAUTH_SECRET,
providers: [
    GoogleProvider({
        clientId: loadCreds().clientId,
        clientSecret: loadCreds().clientSecret,
        authorization: {
            params: {
                prompt: "consent",
                access_type: "offline",
                response_type: "code"
            }
        }
    }),
    YandexProvider({
        clientId: process.env.YANDEX_CLIENT_ID as string,
        clientSecret: process.env.YANDEX_CLIENT_SECRET as string
    })
],
callbacks: {
    async jwt({ token, user }) {
        // 登录时,直接将当前用户信息合并到token
        if (user) {
            return {
                ...token,
                id: user.id,
                name: user.name,
                email: user.email,
                image: user.image
            }
        }
        // 非登录请求,返回现有token(可添加定期同步数据库逻辑)
        return token
    },
    async session({ session, token }) {
        session.user = {
            id: token.id,
            name: token.name,
            email: token.email,
            image: token.image as string
        }
        return session
    },
    redirect() {
        return "/"
    }
}

额外排查点

  • 检查Prisma Schema的唯一性约束:确保User模型的email字段设置为unique,避免不同邮箱的用户被错误关联:
    model User {
      id            String    @id @default(cuid())
      name          String?
      email         String?   @unique
      emailVerified DateTime?
      image         String?
      accounts      Account[]
      sessions      Session[]
    }
    
  • 清除数据库中异常关联的Account记录:如果之前的错误逻辑导致不同提供商的账号关联到了错误的用户,可以手动清除Account表中异常的关联记录,让Next-Auth重新正确关联。
  • 确保退出登录彻底清除token:在退出登录时,使用Next-Auth提供的signOut方法,确保客户端和服务端的token都被清除。

内容的提问来源于stack exchange,提问作者tin2ra6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:12:44