升级PHP版Google API Client后遇“Malformed Auth code”错误求助
排查Google API Client升级后"invalid grant, Malformed Auth code"错误
我之前升级PHP版Google API Client时也碰到过类似的授权问题,结合你的情况,咱们一步步来定位解决:
核心问题:Google+ API已废弃,范围配置错误
首先要敲重点:Google+相关的API早就完全废弃了,Google_Service_Oauth2::PLUS_LOGIN这个范围已经失效,这很可能是导致授权失败的核心原因。现在获取用户信息应该使用标准的OpenID Connect范围:
// 替换原来的PLUS_LOGIN,改用这些范围获取用户基本信息和邮箱 $client->addScope([Google_Service_Oauth2::OPENID, Google_Service_Oauth2::PROFILE, Google_Service_Oauth2::EMAIL]);
修正令牌处理的代码逻辑
你的代码里调用refreshToken的方式有问题,新版本的Google_Client中,refreshToken()方法需要传入refresh_token字符串,而不是整个token数组。而且授权码只能使用一次,重复调用也会触发"invalid grant"错误。修正后的代码如下:
if (!empty($gp_auth_code)) { $client = new Google_Client(); $client->setAuthConfig('<path to client.json file>'); // 使用有效范围 $client->addScope([Google_Service_Oauth2::OPENID, Google_Service_Oauth2::PROFILE, Google_Service_Oauth2::EMAIL]); $client->setRedirectUri('<redirect URI>'); // 获取访问令牌数组 $token = $client->fetchAccessTokenWithAuthCode($gp_auth_code); // 先检查是否有错误返回 if (isset($token['error'])) { die('授权失败: ' . ($token['error_description'] ?? $token['error'])); } $gp_access_token = $token['access_token']; // 直接从token数组中提取refresh_token(如果存在) $gp_refresh_token = $token['refresh_token'] ?? null; // 后续需要刷新令牌时,再调用refreshToken方法,传入refresh_token字符串 // if ($gp_refresh_token) { // $newTokenData = $client->refreshToken($gp_refresh_token); // } }
其他排查要点
- 授权码有效性:确认
$gp_auth_code没有被URL编码两次(比如前端传递时已编码,后端又重复解码/编码),且没有被重复使用(Google授权码仅单次有效)。 - 客户端配置一致性:再次核对client.json中的
client_id、client_secret,以及Google Cloud控制台中配置的重定向URI,确保和代码中的setRedirectUri完全一致(包括http/https、端口、路径)。 - 版本适配:检查Composer安装的google/apiclient版本,不同大版本(比如2.x vs 3.x)的API细节有差异,建议查看对应版本的官方文档确认方法参数。
- 日志排查:开启PHP错误日志,或者在代码中打印
$token的完整内容,看是否有更详细的错误提示,帮助定位问题。
内容的提问来源于stack exchange,提问作者janedoe
相关产品推荐
相关产品推荐

