求助:重新认证时Google Analytics Reporting API v4出现致命错误
我之前在做Google Analytics V3的PHP项目时,也踩过这个令牌过期的坑,给你几个靠谱的解决办法:
配置离线授权并自动刷新令牌
Google PHP客户端库本身支持自动刷新过期的访问令牌,但前提是你在初始化客户端时开启了offline访问类型,并且保存了refresh_token。当检测到令牌过期时,用刷新令牌获取新的访问令牌即可,记得把新令牌持久化存储(比如文件或数据库)。示例代码如下:// 初始化Google客户端(省略client_id、client_secret等基础配置) $client = new Google_Client(); $client->setAccessType('offline'); $client->setApprovalPrompt('force'); // 首次授权强制获取refresh_token $client->addScope('https://www.googleapis.com/auth/analytics.readonly'); // 加载已存储的令牌 $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $token = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($token); } // 检查令牌是否过期,过期则刷新 if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { // 使用refresh_token获取新的访问令牌 $newToken = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); $client->setAccessToken($newToken); // 保存新令牌到文件 file_put_contents($tokenPath, json_encode($newToken)); } else { // 没有refresh_token,需要引导用户重新授权 header('Location: ' . $client->createAuthUrl()); exit; } }确保令牌持久化正确
很多时候问题出在没有完整保存令牌数据。第一次授权成功后,客户端返回的令牌包含access_token、expires_in和refresh_token,你需要把整个令牌对象都存起来,下次启动项目时直接加载,而不是每次都重新走授权流程。核对授权范围
确认你请求的授权范围包含Analytics Reporting所需的权限,比如https://www.googleapis.com/auth/analytics.readonly,如果权限范围不对,即使令牌有效也会触发401错误。
你遇到的错误信息很明确:
Fatal error: Uncaught Google_Service_Exception: { "error": { "code": 401, "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project .", "errors": [ { "message": "Request had ..." } ] } }
本质就是当前使用的访问令牌已经失效,按照上面的方法处理令牌的刷新和存储就能解决问题。
内容的提问来源于stack exchange,提问作者StephenB

