Passport Google OAuth2调用People API无法获取手机号与地址
问题排查与解决办法
针对你无法通过Google People API获取手机号和地址的问题,以下是具体排查方向和解决步骤:
1. 修正People API请求的用户标识符
你当前使用people/${email.id}作为请求路径,建议替换为people/me——这个标识符会自动关联当前授权的用户,避免因用户ID格式错误导致的请求异常:
// 原代码 const extendedData = yield axios_1.default.get(`https://people.googleapis.com/v1/people/${email.id}?personFields=${urlFields}&access_token=${accessToken}`); // 修改后 const extendedData = yield axios_1.default.get(`https://people.googleapis.com/v1/people/me?personFields=${urlFields}&access_token=${accessToken}`);
2. 修复PersonFields拼接的语法错误
你的代码中拼接urlFields时,最后会多一个冗余的逗号(比如birthdays,phoneNumbers,),这会导致Google API忽略后面的字段。改用数组收集字段再拼接更可靠:
// 原代码 let urlFields = ""; tokenInfo.data.scope.split(" ").forEach((scope) => { if (authorizationObject[scope] !== "") urlFields += authorizationObject[scope] + ","; }); urlFields = urlFields.substring(0, urlFields.length); // 此处未正确移除末尾逗号 // 修改后 const fieldsArray = []; tokenInfo.data.scope.split(" ").forEach((scope) => { const field = authorizationObject[scope]; if (field) { // 跳过空字符串的scope映射 fieldsArray.push(field); } }); const urlFields = fieldsArray.join(",");
3. 验证Access Token实际包含的Scope
在代码中打印tokenInfo.data.scope,确认返回的字符串中包含https://www.googleapis.com/auth/user.phonenumbers.read和https://www.googleapis.com/auth/user.addresses.read:
console.log("当前Token包含的Scope:", tokenInfo.data.scope);
如果这两个Scope不存在,说明授权流程中Scope没有正确传递——检查路由和Strategy中的Scope配置是否重复或遗漏,建议统一在路由或Strategy中配置一次即可,避免冲突。
4. 确认Google账户中已填写目标信息
Google People API只会返回用户在Google账户中已填写且允许授权应用访问的信息。请登录你的Google账户,在个人资料页面确认手机号、地址等信息已完整填写,且隐私设置允许第三方应用访问。
5. 检查OAuth consent screen的权限配置
在Google开发者控制台的OAuth consent screen中:
- 确认
user.addresses.read和user.phonenumbers.read已添加到Scopes for Google APIs列表中 - 如果是生产环境(非测试用户),需提交权限审核并通过;测试阶段需确保当前测试账户已加入Test users列表
内容的提问来源于stack exchange,提问作者Adrian Abadán
相关产品推荐
相关产品推荐

