Google Calendar推送通知后同步失败(403权限错误)求助
Google Calendar推送后同步403错误排查方案
问题本质
你碰到的403错误,核心是接收推送后调用Calendar API时没带有效身份凭证。Google的推送通知本身不会附带用户的OAuth2令牌,得你自己从存储里取出对应用户的凭证来用。那个错误提示说的“未注册调用者”,就是因为API请求里没带能证明身份的东西——要么是用户的AccessToken,要么是API Key(但API Key只适用于公开数据,拿用户日历事件得用OAuth2令牌)。
具体解决步骤
先把用户的OAuth2凭证存好
- 之前做OAuth2登录回调的时候,肯定拿到了用户的
Credential对象(包含AccessToken、RefreshToken这些),得把这个对象和用户的唯一标识(比如邮箱、用户ID)绑定,存到数据库或者Redis里。 - 当初创建watch的时候,Google会返回
resourceId,你得把这个resourceId也和用户ID绑定存起来——后面收到推送时,就能用resourceId找到对应的用户。
- 之前做OAuth2登录回调的时候,肯定拿到了用户的
收到推送时拿对应用户的凭证
- 收到Google发的POST推送请求后,先解析请求体里的
resourceId,用它从存储里找出关联的用户Credential。 - 如果AccessToken过期了,别慌,用RefreshToken去换个新的AccessToken(Java的Google Client Library里的
GoogleCredential会自动处理刷新,不用自己写接口调用)。
- 收到Google发的POST推送请求后,先解析请求体里的
带凭证调用Calendar API
- 调用API的时候,必须把拿到的AccessToken带上。用Google Client Library的话,直接把
Credential对象传给Calendar服务的Builder就行,示例代码:// 从存储里取用户的Credential Credential userCredential = getCredentialByResourceId(pushResourceId); // 初始化Calendar服务 Calendar calendarService = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, userCredential) .setApplicationName("你的应用名") .build(); // 同步事件 Events events = calendarService.events().list("primary").execute();
- 调用API的时候,必须把拿到的AccessToken带上。用Google Client Library的话,直接把
检查云控制台配置
- 确认Google Cloud控制台里,你的项目已经启用了Google Calendar API。
- OAuth2同意屏幕里,已经添加了
https://www.googleapis.com/auth/calendar或者https://www.googleapis.com/auth/calendar.readonly权限(看你是要读写还是只读)。
踩过的坑提醒
- 别指望推送请求自带用户凭证:Google推送只是通知你“某个日历变了”,不负责给你带用户的令牌,得自己关联。
- 一定要处理Token过期:AccessToken有效期只有1小时,必须靠RefreshToken自动刷新,不然过段时间就会又出403。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

