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

Google Calendar API的refresh_token未自动刷新,未验证应用一周后失效

问题原因

你遇到的这个refresh_token7天过期的问题,确实是应用未完成谷歌官方验证直接导致的。
谷歌针对 OAuth 同意屏幕处于「测试状态」的未验证应用,有明确的限制规则:所有测试用户授权产生的refresh_token有效期固定为7天,到期后自动作废,无法再用来刷新access_token,这是平台的安全限制,和代码逻辑无关。

代码缺失逻辑补充

你理解的逻辑没错,但官方示例代码只实现了凭证刷新的内存逻辑,缺失了刷新后把新凭证写回本地token.json的持久化步骤:
你现有代码调用creds.refresh(Request())后,更新后的access_token(如果谷歌返回了新的refresh_token,也会同步更新在creds对象中)只存在于运行时内存里,程序重启后还是会读取本地存储的旧token.json内容,也会触发过期报错。
补全后的参考代码如下:

if os.path.exists('token.json'):
    creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
        # 新增:刷新后将最新凭证写回本地文件
        with open('token.json', 'w') as token_file:
            token_file.write(creds.to_json())
    else:
        # 原有走授权流程的逻辑
        ...

已验证应用的refresh_token规则补充

当你完成应用验证、将应用发布为正式状态后,refresh_token默认不会自动过期,只有以下场景会失效:

  • 用户手动在谷歌账号的安全设置中撤销了对你应用的授权
  • 授权请求时没有指定access_type=offline参数(默认是online模式,不会返回长效refresh_token)
  • 同一个谷歌账号对同一个应用累计授权超过50个refresh_token,最早生成的会自动作废
  • 应用6个月没有任何活跃请求,对应的refresh_token会被自动回收

内容的提问来源于stack exchange,提问作者Lukas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:05