服务帐户域范围内的委托-PHP上的Google Calendar API v3

问题描述 投票:0回答:1

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

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


情况

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

我使用“普通”用户日历进行了测试:

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

这里是代码:

<?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('[email protected]', $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('[email protected]');

然后阅读房间的日历:

$results = $service->events->listEvents('[email protected]', $optParams);

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

我对使用Google API PHP客户端(https://github.com/googleapis/google-api-php-client)的域范围委派有问题。我知道之前曾有人问过这个问题,但我找不到任何...

php google-calendar-api google-api-php-client service-accounts domain-wide-delegation
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.