У меня проблема с делегированием по всему домену с использованием Google API PHP Клиент (https://github.com/googleapis/google-api-php-client).
Я знаю, что этот вопрос задавался ранее, но не смог Я не могу найти никакого решения, поэтому я здесь снова спрашиваю, надеясь, что тем временем кто-то решил эту проблему.
Ситуация
Я создал учетную запись службы и включил G Suite делегирования на уровне домена, следуя руководству Google (https://developers.google.com/admin-sdk/directory/v1/guides/delegation), но я не могу читать календари из своей учетной записи службы, если они не предоставлены в явном виде.
Я протестировал его с «обычный» календарь пользователя:
- Если я не делюсь календарем, появляется сообщение об ошибке «Не найдено»
- Если я делю календарь с учетной записью службы (Настройки календаря> Поделитесь с указанными c людьми> добавить учетную запись службы), я могу читать события в этом календаре из учетной записи службы
Вот код:
<?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);
Таким образом, вам даже не нужно делиться календарями пользователя или комнаты с учетной записью службы!