谷歌日历同步报错:OAuth2令牌刷新失败(unauthorized_client)
我之前对接谷歌日历API的时候也碰到过一模一样的错误,折腾了好一阵子才搞定,给你梳理几个最常见的排查方向,按顺序试应该能解决:
检查OAuth客户端类型是否匹配你的授权流程
这是最容易踩坑的点!谷歌的OAuth客户端分好几种类型:Web应用、桌面应用、移动应用、服务账号。如果你的应用是桌面端,却用了Web应用的客户端ID,或者反过来,直接就会触发这个错误。比如你用的是授权码流程(Authorization Code Flow),但客户端类型选成了服务账号,肯定行不通。赶紧去谷歌云控制台的「API和服务」→「凭据」页面,找到你的客户端ID,确认它的类型和你的应用场景完全匹配。确认授权流程的正确性
不同客户端类型对应不同的授权逻辑,别搞混了:- 要是Web应用,必须用授权码流程,还要确保回调URL已经在控制台里配置好,并且和你代码里的
redirect_uri完全一致(包括http/https协议、域名、路径,甚至末尾有没有斜杠都要对应上); - 桌面/移动应用得用带PKCE的授权码流程,而且不能用客户端密钥——毕竟桌面端没法安全存储密钥,硬加进去反而会报错;
- 服务账号要走JWT流程,不是普通的OAuth授权码那套,还要给服务账号授予对应的日历权限,如果是G Suite账号的话,还得启用域范围委派。
- 要是Web应用,必须用授权码流程,还要确保回调URL已经在控制台里配置好,并且和你代码里的
验证客户端ID和密钥是否正确
别大意,有时候复制粘贴的时候会多个空格或者漏个字符。去控制台重新复制一遍客户端ID和密钥,替换掉你代码里的配置,确保完全一致,没有任何拼写错误。检查谷歌日历API是否已启用
去谷歌云控制台的「API和服务」→「库」里,搜索「谷歌日历API」,确认它的状态是「已启用」。要是没启用,哪怕凭据配置全对,也会报授权相关的错误。检查OAuth同意屏幕的配置
如果你的应用还在测试阶段,一定要确保测试用户列表里添加了你用来授权的账号。另外,同意屏幕里的「应用名称」「支持邮箱」这些必填项都要填完整,不能留空——谷歌对这块的校验挺严的。
要是以上步骤都试过还是不行,建议直接重新创建一个对应类型的客户端凭据,有时候旧凭据可能因为之前的配置变更留下缓存问题,新创建的反而能正常工作。
内容的提问来源于stack exchange,提问作者Walaa Abu Hasanein

