配置Google域范围委派后调用Calendar API返回notFound错误
根因
你漏了域范围委派的核心必填步骤:服务账号鉴权时未指定要模拟的域内目标用户。
服务账号本身是独立的技术账号,不属于你的Google Workspace租户下的普通用户,你当前的代码实际是以服务账号自身身份调用Calendar API,这个身份下不存在你要查询的目标日历资源,因此返回notFound错误。
域范围委派的逻辑是管理员授权服务账号「可以模拟域内用户」,但代码里必须显式声明要模拟哪个用户,不会自动根据你请求的日历ID匹配身份。
修复方案
生成服务账号凭证时,通过sub参数传入要模拟的用户邮箱(即你代码中的日历所属人owner_email),同时修正你代码里的两处语法笔误:
- 给
authorization属性赋值时缺少等号 - 调用接口的服务对象名和实例化的对象名不一致
修改后的可运行代码示例:
google_calendar_service = ::Google::Apis::CalendarV3::CalendarService.new google_calendar_service.authorization = ::Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open(PATH_TO_JSON_FILE), scope: MY_SCOPES, sub: owner_email # 新增该行,指定要模拟的域内用户身份 ) google_calendar_service.get_event(owner_email, event_id)
校验提示
- 代码中传入的
MY_SCOPES必须和你在Workspace管理后台域委派配置页填写的scopes完全一致,否则会报权限错误 - 域委派配置最长需要5分钟左右的生效时间,刚配置完立刻测试可能出现偶发权限异常
- 不需要单独给服务账号共享目标日历,只要域委派配置正确、sub参数传对,服务账号就拥有对应scopes下该用户的日历权限
内容的提问来源于stack exchange,提问作者João Fernandes
相关产品推荐
相关产品推荐

