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

