使用Google Oauth 2.0 API调用谷歌日历接口时Access Token过期问题求助
Laravel 框架下 Google OAuth 2.0 谷歌日历功能AccessToken过期问题解决方案
核心问题排查方向
- Refresh Token有效期问题:未通过Google OAuth同意屏幕发布审核的测试应用,Refresh Token默认有效期仅为7天,且同一账号最多同时存在50个有效Refresh Token,超出后最早生成的Token会自动失效。
- Refresh Token存储字段异常:Google Refresh Token最长可达512字符,需确认DB存储字段类型为
varchar(1024),避免字段长度不足导致Token被截断无法使用。 - Token刷新逻辑缺陷:刷新AccessToken时如果接口返回了新的Refresh Token,未同步更新DB存储的旧Refresh Token,会导致后续刷新请求使用已失效的旧Refresh Token报错。
标准实现代码示例
首先安装官方依赖包:composer require google/apiclient:^2.15
核心业务逻辑:
// 初始化Google客户端配置 $googleClient = new \Google\Client(); $googleClient->setClientId(config('services.google.client_id')); $googleClient->setClientSecret(config('services.google.client_secret')); $googleClient->setRedirectUri(config('services.google.redirect_uri')); $googleClient->setAccessType('offline'); $googleClient->setPrompt('consent'); $googleClient->addScope(\Google\Service\Calendar::CALENDAR_EVENTS); // 从数据库读取当前用户绑定的Token数据 $userToken = \DB::table('user_google_oauth_tokens') ->where('user_id', auth()->id()) ->firstOrFail(); $googleClient->setAccessToken([ 'access_token' => $userToken->access_token, 'refresh_token' => $userToken->refresh_token, 'expires_in' => $userToken->expires_in, 'created' => $userToken->token_created_timestamp ]); // 自动检测AccessToken是否过期,过期自动刷新 if ($googleClient->isAccessTokenExpired()) { $newToken = $googleClient->fetchAccessTokenWithRefreshToken($googleClient->getRefreshToken()); // 刷新失败抛出异常,引导用户重新授权 if (isset($newToken['error'])) { throw new \RuntimeException('Google账号授权已失效,请重新绑定'); } // 刷新成功后更新数据库存储的Token信息 \DB::table('user_google_oauth_tokens') ->where('user_id', auth()->id()) ->update([ 'access_token' => $newToken['access_token'], // 若接口返回新的Refresh Token则更新,否则沿用原有值 'refresh_token' => $newToken['refresh_token'] ?? $userToken->refresh_token, 'expires_in' => $newToken['expires_in'], 'token_created_timestamp' => time(), 'updated_at' => now() ]); $googleClient->setAccessToken($newToken); } // 初始化日历服务后即可正常调用接口 $calendarService = new \Google\Service\Calendar($googleClient);
额外配置校验
- 登录Google Cloud控制台进入OAuth同意屏幕配置页,确认应用状态已调整为正式发布,测试状态下的应用Refresh Token7天自动过期。
- 确认授权请求参数已添加
access_type=offline和prompt=consent,否则首次授权时无法获取到Refresh Token。 - 避免短时间内频繁调用Token刷新接口,Google对该接口有频率限制,触发限流会导致刷新失败。
内容的提问来源于stack exchange,提问作者Anil Parshi
相关产品推荐
相关产品推荐

