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

如何获取Google One Tap用户个人资料中的手机号码

Google One Tap 登录获取手机号方案

核心结论

你当前无法拿到手机号属于正常现象:Google One Tap 默认返回的 JWT 凭证仅包含邮箱、姓名、头像这类基础公开信息,无论用户是否绑定手机号、是否开启相关分享设置,该凭证本身不会返回手机号字段。你现有逻辑仅解码 JWT 凭证,自然无法获取到手机号。

实现方案

若确实需要收集用户手机号,需额外完成以下操作:

  • 先在 Google Cloud 控制台的 OAuth 同意屏幕配置中,新增 https://www.googleapis.com/auth/user.phonenumbers.read 敏感权限。该权限属于 Google 敏感权限范畴,正式环境使用前需要提交场景说明申请审核,只有合理使用场景才会通过审核。
  • 修改 One Tap 初始化配置,在授权参数中加入上述 scope,请求用户授予读取手机号的权限。
  • 用户完成登录后,使用登录返回的 access_token 调用 Google People API 的 people/me 接口,指定请求字段包含 phoneNumbers,即可获取用户授权公开的手机号。
  • 必须做兼容兜底:如果用户拒绝授权手机号权限、账号未绑定手机号、或手机号未设置为公开状态,接口返回结果中不会包含对应字段。

补充代码示例

你可以在现有登录逻辑基础上新增接口调用逻辑,参考如下:

const onOneTapSignedIn = async (response: any) => {
  const decodeToken: GoogleUser = jwt_decode(response.credential);
  // 新增:调用People API获取手机号
  let phoneNumbers = []
  try {
    const peopleRes = await fetch('https://people.googleapis.com/v1/people/me?personFields=phoneNumbers', {
      headers: { Authorization: `Bearer ${response.access_token}` }
    })
    const peopleData = await peopleRes.json()
    phoneNumbers = peopleData.phoneNumbers || []
  } catch (e) {
    // 权限未授予/接口调用失败的兜底逻辑
  }
  setLocalStorage('googleUser', {
    email: decodeToken.email,
    familyName: decodeToken.family_name,
    givenName: decodeToken.given_name,
    name: decodeToken.name,
    picture: decodeToken.picture,
    phoneNumbers: phoneNumbers // 新增手机号字段
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:06:03