服务帐户域范围委派-PHP上的Google日历API v3



我在使用Google API PHP客户端进行域委托时遇到问题(https://github.com/googleapis/google-api-php-client)。

我知道以前有人问过这个问题,但我找不到任何解决方案,所以我在这里再次提问,希望有人能解决这个问题。


情况

我创建了一个服务帐户,并按照谷歌指南启用了G Suite域范围委派(https://developers.google.com/admin-sdk/directory/v1/guides/delegation),但如果没有明确共享日历,我将无法从我的服务帐户中读取这些日历。

我用一个"普通"用户日历进行了测试:

  • 如果我不共享日历,我会收到错误"未找到">
  • 如果我与服务帐户共享日历(日历设置>与特定人员共享>添加服务帐户(,我可以从服务帐户读取此日历中的事件

这是代码:

<?php
require __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json');
$client->useApplicationDefaultCredentials();
$client->setApplicationName('TestCalendarAPI');
$client->authorize();
$scopes = implode(' ', array(Google_Service_Calendar::CALENDAR, Google_Service_Calendar::CALENDAR_EVENTS));
$client->setScopes($scopes);
$service = new Google_Service_Calendar($client);
$optParams = array(
'maxResults' => 10,
'orderBy' => 'startTime',
'singleEvents' => TRUE,
'timeMin' => date('c')
);
$results = $service->events->listEvents('user@email.com', $optParams);
$events = $results->getItems();
if (empty($events)) {
print "No upcoming events found.n";
}
else {
foreach ($events as $event) {
printf("Summary: %s n", $event->summary);
}
}

问题

问题是,我不想与服务帐户共享每个日历,以便能够阅读他们的活动。这难道不是整个领域授权的目的吗?

此外,我想做的是读取资源的事件,并且我不能与服务帐户共享资源的日历。如果无法让域范围的委派工作,你知道如何与服务帐户共享资源日历吗?

提前感谢您的帮助!


解决方案

这就是我采用的解决方案(希望这能帮助到别人!(。

我模拟了一个订阅了我感兴趣的房间的用户:

$client->setSubject('user@email.com');

然后阅读房间的日历:

$results = $service->events->listEvents('room@email.com', $optParams);

这样,甚至不需要与服务帐户共享用户或房间的日历!

使用服务帐户,您需要模拟域用户才能访问与该用户相同的数据,否则您只能请求可访问的公共数据。您可以模拟每个用户,以防需要每个用户的日历。

从Google API PHP库的例子中,您可以在设置client对象时使用setSubject方法:

$client->setSubject($user_to_impersonate);

最新更新