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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:16