PHP通过服务账号调用Google Calendar API为G Suite新用户订阅日历问题
问题原因
你当前的请求使用服务账号自身的身份发起,因此所有日历操作默认作用于服务账号本身的日历列表。要操作同Google Workspace域内其他用户的日历数据,需要给服务账号开启全域权限委派,再通过模拟目标用户身份发起请求。
前置配置要求
- 进入Google Cloud控制台的服务账号管理页,为你使用的服务账号开启「G Suite全域权限委派」功能
- 进入Google Workspace管理后台的「安全 > API控制 > 全域权限委派」页面,为该服务账号的客户端ID授予日历操作权限,必须包含 scope:
https://www.googleapis.com/auth/calendar
修改后的代码示例
你只需要在初始化Google客户端时新增setSubject方法,传入要操作的目标新用户的企业邮箱即可:
// 初始化Google客户端 $client = new Google_Client(); $client->setAuthConfig('你的服务账号密钥文件路径.json'); $client->addScope('https://www.googleapis.com/auth/calendar'); // 关键配置:指定要模拟的目标用户邮箱,要给哪个用户加日历就填哪个用户的域内邮箱 $client->setSubject($newUserEmail); $service = new Google_Service_Calendar($client); $calendarListEntry = new Google_Service_Calendar_CalendarListEntry(); $calendarListEntry->setId("要订阅的公司公共日历ID"); // 可选配置:自定义日历在用户侧的显示名称、颜色等 $calendarListEntry->setSummary('公司标准办公日历'); $calendarListEntry->setColorId('12'); $calendarListEntry = $service->calendarList->insert($calendarListEntry);
注意事项
- 服务账号的全域委派仅支持操作同域内的企业用户,无法操作域外普通Gmail账号
- 权限配置完成后可能存在最长10分钟的缓存延迟,刚配置完提示无权限可等待后重试
- 批量给多个用户订阅日历时,只需要循环切换
setSubject传入的用户邮箱即可
内容的提问来源于stack exchange,提问作者Barry Ralphs
相关产品推荐
相关产品推荐

