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
相关产品推荐
相关产品推荐

