如何获取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
相关产品推荐
相关产品推荐

