PHP调用Google API获取用户信息无email字段如何解决
问题根源
你当前获取不到email字段的核心原因有两个:
- 你现在代码里加的scope配置是针对新的授权流程的,而你用来验证的
$tokenId是用户之前授权时生成的,当时授权并没有申请email相关权限,所以返回的JWT payload里自然不会带email字段 - 你额外加了不必要的scope,
plus.login和analytics.readonly和获取用户邮箱无关,反而可能干扰授权配置
解决步骤
- 第一步:清理多余的scope配置,保留必要的用户信息权限即可,修改后的scope配置如下:
// 移除不必要的analytics、plus.login相关scope,仅保留需要的权限 $google_client->setScopes([ 'https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email', 'email', 'openid' // 补充openid基础scope,这是OIDC返回用户身份信息的基础要求 ]);
- 第二步:触发用户重新授权,让用户在Google的授权页面确认授予你邮箱读取权限,拿到新的
$tokenId后再进行验证 - 第三步:验证新token时,如果还是没拿到email,可以额外调用userinfo接口补全信息,代码示例:
if ($credentials) { $data = $credentials->getAttributes(); // 如果payload中没有email,调用userinfo接口获取 if (!isset($data['payload']['email'])) { $oauth = new Google_Service_Oauth2($google_client); $userInfo = $oauth->userinfo->get(); $email = $userInfo->getEmail(); // 把email合并到返回数据里即可 $data['payload']['email'] = $email; } echo "<pre>";print_R($data); }
补充说明
部分Google账号可能没有设置公开邮箱,即便你申请了权限也可能返回为空,这种情况需要引导用户绑定邮箱或者用其他方式获取身份信息。
内容的提问来源于stack exchange,提问作者Ritika
相关产品推荐
相关产品推荐

