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

使用Google Oauth 2.0 API调用谷歌日历接口时Access Token过期问题求助

Laravel 框架下 Google OAuth 2.0 谷歌日历功能AccessToken过期问题解决方案

Access Token报错截图

核心问题排查方向

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:48:04