测试模式下Google第三方应用连接断开及令牌报错咨询
问题原因及解决办法
核心原因
- 测试应用的refresh token有效期限制:Google对未发布的测试应用有严格权限管控,refresh token默认仅7天有效期。过期后无法用来刷新access token,就会触发
refresh token must be passed in or set as part of setAccessToken错误,这就是每周连接断开的直接原因。 - 未开启离线访问授权:如果授权流程没明确请求
offline访问类型,Google不会返回长期有效的refresh token,只给短期access token,过期后自然续期失败。
解决步骤
- 重新授权时强制请求离线访问:生成授权URL时必须添加
access_type=offline和prompt=consent参数,确保获取到可续期的refresh token。Laravel中代码示例:
重新引导用户完成授权后,就能拿到有效期7天的refresh token(测试应用下的上限)。$client = new Google_Client(); $client->setAccessType('offline'); $client->setPrompt('consent'); // 强制用户重新授权,确保返回refresh token - 完善token存储与刷新逻辑:确保代码正确存储refresh token,每次调用API前先检查access token是否过期,过期则用refresh token刷新。示例代码:
$client->setAccessToken($storedToken); if ($client->isAccessTokenExpired()) { if ($refreshToken = $client->getRefreshToken()) { $newToken = $client->fetchAccessTokenWithRefreshToken($refreshToken); // 把新的access token和原refresh token一起保存 $newToken['refresh_token'] = $refreshToken; // 更新数据库/缓存中的token数据 } else { // 无refresh token,需引导用户重新授权 } } - 提交应用审核转为正式版:如果要彻底摆脱7天有效期限制,需要在Google Console提交应用审核,发布为正式应用。审核通过后,refresh token只要用户不主动撤销授权,就不会过期。
内容的提问来源于stack exchange,提问作者diSQRL
相关产品推荐
相关产品推荐

