使用Google账号登录并通过Google API获取用户信息时遇错误求助
嘿,我看了你贴的代码片段,能发现好几个导致你没法正常获取Google登录用户信息的问题,咱们一步步来搞定它:
核心问题分析
你的代码只初始化了Google Client,但缺失了OAuth2授权流程的核心逻辑,而且有无效代码(比如单独一行$_SESSION['access_token'];啥也没做),还截断了关键的判断逻辑。另外,你只请求了Drive的权限,没申请获取用户信息的Scope,这也是拿不到用户数据的关键。
完整修复方案
1. 补充必要的权限Scope
要获取用户的基本信息(姓名、邮箱、头像等),必须添加OAuth2相关的Scope,和Drive的Scope一起设置:
// 替换原有的addScope行,或者追加 $client->addScope([ Google_Service_Drive::DRIVE_METADATA_READONLY, Google_Service_Oauth2::USERINFO_PROFILE, // 获取用户基本资料 Google_Service_Oauth2::USERINFO_EMAIL // 获取用户邮箱(可选) ]);
2. 完善完整的授权&Token处理逻辑
下面是补全后的完整代码,包含授权跳转、Token存储、过期刷新和用户信息获取:
error_reporting(E_ALL); ini_set('display_errors',1); require_once __DIR__.'/vendor/autoload.php'; // 必须在输出任何内容之前启动Session session_start(); $client = new Google_Client(); $client->setAuthConfig('client_secret_gmail.json'); // 设置权限Scope $client->addScope([ Google_Service_Drive::DRIVE_METADATA_READONLY, Google_Service_Oauth2::USERINFO_PROFILE, Google_Service_Oauth2::USERINFO_EMAIL ]); // 设置回调URL,必须和Google Cloud控制台里配置的完全一致 $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); // 开启离线访问,获取刷新Token(避免频繁要求用户授权) $client->setAccessType('offline'); // 处理Google授权后的回调(当URL里有code参数时) if (isset($_GET['code'])) { // 通过授权码获取Token $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); $client->setAccessToken($token); // 将Token存入Session $_SESSION['access_token'] = $token; // 跳转回当前页面,清除URL里的code参数 header('Location: ' . filter_var($client->getRedirectUri(), FILTER_SANITIZE_URL)); exit; } // 检查Session里是否有有效Token if (isset($_SESSION['access_token']) && !empty($_SESSION['access_token'])) { $client->setAccessToken($_SESSION['access_token']); // 检查Token是否过期,尝试用刷新Token更新 if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { // 用刷新Token获取新的访问Token $newToken = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); $client->setAccessToken($newToken); $_SESSION['access_token'] = $newToken; } else { // 没有刷新Token,需要重新授权 unset($_SESSION['access_token']); header('Location: ' . $client->createAuthUrl()); exit; } } // 现在可以获取用户信息了 $oauthService = new Google_Service_Oauth2($client); $userInfo = $oauthService->userinfo->get(); echo "<pre>"; print_r($userInfo); // 输出用户的姓名、邮箱、头像ID、性别等信息 echo "</pre>"; } else { // 没有有效Token,跳转到Google授权页面 $authUrl = $client->createAuthUrl(); header('Location: ' . $authUrl); exit; }
3. 关键配置检查
- 确保
client_secret_gmail.json文件路径正确,是从Google Cloud控制台下载的OAuth 2.0客户端ID文件 - 控制台里的授权重定向URI必须和代码中
setRedirectUri设置的完全一致(包括HTTP/HTTPS、域名、路径) - 确保你的Google Cloud项目已经启用了Google Identity OAuth2 API(在API库中搜索并启用)
常见错误排查
- 如果出现
invalid_grant错误:大概率是刷新Token过期/被撤销,或者回调URL不匹配,清除Session后重新授权即可 - 如果无法获取用户信息:检查是否添加了正确的OAuth2 Scope,且用户授权时允许了这些权限
- 如果Session中Token为空:确保
session_start()在任何输出(包括空格、HTML标签)之前调用,且服务器Session功能正常
内容的提问来源于stack exchange,提问作者Engg Php
相关产品推荐
相关产品推荐

