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
相关产品推荐
相关产品推荐

