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

NextAuth.js中Google OAuth无法获取账号信息问题排查

问题分析与解决方案

你的问题出在两个关键配置缺失:Google OAuth 权限范围未请求用户基本信息,以及JWT 回调未将用户信息存入 Token。以下是具体修复步骤:

1. 补充 Google Provider 的权限范围

当前你的 Google 登录请求只包含 openid 和 Gmail 只读权限,没有请求用户的名称、邮箱、头像等基础信息。需要在 scope 中添加 email 和 profile:

GoogleProvider({
  clientId: getGoogleCredentials().clientId,
  clientSecret: getGoogleCredentials().clientSecret,
  authorization: {
    params: {
      prompt: "consent",
      access_type: "offline",
      response_type: "code",
      // 补充获取用户基础信息的权限
      scope: "openid email profile https://www.googleapis.com/auth/gmail.readonly",
    },
  },
}),

2. 在 JWT 回调中存入用户信息

首次登录时,NextAuth 会将 user、profile 对象传入 JWT 回调,但你当前的代码没有将这些信息存入 Token。修改 JWT 回调,把用户名称、邮箱、头像等字段写入 Token:

async jwt({ token, account, user, profile }) {
  console.log("# JWT CALLBACK #")
  console.log({token, account, user, profile})
  
  // 首次登录时,user 和 profile 会携带用户信息
  if (user && profile) {
    token.id = user.id; // 数据库用户ID,若用Google原生ID则用 profile.sub
    token.name = profile.name;
    token.email = profile.email;
    token.picture = profile.picture;
  }
  
  if (account) {
    token.accessToken = account.access_token;
  }
  return token;
},

3. (可选)同步用户信息到 Session

如果你需要在前端通过 useSession 获取用户信息,可同步修改 session 回调:

async session({ session, token }: any) {
  if (token) {
    session.user.id = token.id;
    session.user.name = token.name;
    session.user.email = token.email;
    session.user.image = token.picture;
    session.accessToken = token.accessToken;
  }
  return session;
},

修复后效果

完成以上配置后,首次登录时的 JWT 回调会获取到完整的 user 和 profile 对象,且 Token 中会包含名称、邮箱、头像字段。调用 getToken({ req }) 即可拿到这些信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:13:20