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

前端获取Google OAuth2 id_token后,Django后端无法获取用户姓名及邮箱

问题解决方法

首先,要获取用户姓名和邮箱,必须确保OAuth2请求中包含三个核心权限范围(scope):openid、email、profile——其中openid是OpenID Connect协议的基础,缺失的话id_token只会包含基础身份标识字段,不会返回用户个人信息。

1. 修正前端授权请求参数

调用chrome.identity.launchWebAuthFlow时,必须构造包含完整scope的授权URL,示例代码如下:

const authUrl = new URL('https://accounts.google.com/o/oauth2/v2/auth');
authUrl.searchParams.set('client_id', '你的客户端ID');
authUrl.searchParams.set('response_type', 'id_token');
authUrl.searchParams.set('redirect_uri', chrome.identity.getRedirectURL());
// 必须包含openid、email、profile三个scope
authUrl.searchParams.set('scope', 'openid email profile');
// 必须添加nonce参数用于安全验证
authUrl.searchParams.set('nonce', Math.random().toString(36).substring(2));
// 可选:强制用户重新授权,确保权限生效
authUrl.searchParams.set('prompt', 'consent');

chrome.identity.launchWebAuthFlow({url: authUrl.toString(), interactive: true}, (idToken) => {
  // 将idToken传递给后端验证
});

同时,确保Chrome扩展的manifest.json中oauth2配置包含对应scope:

"oauth2": {
  "client_id": "你的客户端ID",
  "scopes": [
    "openid",
    "email",
    "profile"
  ]
}

2. 验证id_token原始载荷

如果添加scope后仍未获取到姓名,可以先解码id_token的原始载荷,确认Google是否返回了对应字段。用Python解码示例:

import jwt
# 仅解码不验证签名,用于查看原始内容
decoded_payload = jwt.decode(token, options={"verify_signature": False})
print(decoded_payload)

正常情况下,载荷中应该包含name(全名)、given_name(名)、family_name(姓)、email这些字段。如果原始载荷中没有,说明:

  • 前端请求的scope仍然不完整
  • 用户未授权profile权限(可以通过prompt=consent强制重新授权)

3. 后端验证注意事项

确保后端验证时使用的MY_APP_CLIENT_ID和前端请求的客户端ID完全一致,否则验证后的idinfo可能会过滤掉部分字段。

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

相关产品推荐
方舟 Agent Plan

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

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