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

Spring Boot集成Google日历遇invalid_grant:令牌过期或吊销问题

问题分析与修复方案

核心问题

你遇到的com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request,错误信息invalid_grant + "Token has been expired or revoked",结合刷新令牌后1小时复现的情况,根源是Refresh Token失效或刷新逻辑异常。

排查修复步骤

  • 确认Refresh Token有效性
    Google的Refresh Token不是永久有效的:

    • 若应用处于测试状态,生成的Refresh Token仅7天有效期(哪怕2021年创建的应用,没发布到生产的话,测试令牌始终是7天有效期)
    • 若你在Google账号安全设置里撤销过该应用的授权,Refresh Token会直接失效
    • 同一账号针对同一应用生成超过50个Refresh Token时,最早的会被自动吊销
      解决:重新走OAuth授权流程,务必开启离线访问模式(access_type=offline),获取新的有效Refresh Token。
  • 检查GoogleCredential的令牌管理逻辑
    确保代码让GoogleCredential自动处理令牌刷新,而不是手动维护AccessToken:
    错误做法:手动获取AccessToken后硬编码使用,没利用Credential的自动刷新机制
    正确示例代码:

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(httpTransport)
        .setJsonFactory(jsonFactory)
        .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
        .build()
        .setRefreshToken(REFRESH_TOKEN);
    
    // 调用API前Credential会自动检查令牌是否过期,失效则用Refresh Token刷新
    Calendar service = new Calendar.Builder(httpTransport, jsonFactory, credential)
        .setApplicationName(APPLICATION_NAME)
        .build();
    

    要是你手动刷新后只更新了AccessToken,没同步更新Credential里的Refresh Token(或者刷新时Refresh Token已经失效),1小时AccessToken过期后必然再次报错。

  • 验证OAuth权限范围
    确认应用请求的权限包含日历相关权限(比如https://www.googleapis.com/auth/calendar或https://www.googleapis.com/auth/calendar.events),权限被修改或撤销也会导致令牌失效。

  • 检查开发者控制台应用状态

    • 确认应用没被Google封禁或限制
    • 检查OAuth consent screen状态:测试状态下只有添加到测试用户列表的账号能正常使用,若测试用户被移除,令牌会直接失效

额外建议

  • 生产环境优先用服务账号替代用户OAuth令牌,避免因用户账号操作(比如改密码、撤销授权)导致服务中断,服务账号可通过域范围委派实现日历操作(适用于G Suite/Workspace账号)
  • 定期轮换Refresh Token,降低令牌泄露或自动吊销的风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:30:16