Сервисный аккаунт делегирования домена - API Календаря Google v3 на PHP - PullRequest
0 голосов
/ 16 марта 2020

У меня проблема с делегированием по всему домену с использованием 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);

Таким образом, вам даже не нужно делиться календарями пользователя или комнаты с учетной записью службы!

1 Ответ

0 голосов
/ 16 марта 2020

С помощью учетной записи службы вам необходимо выдать себя за пользователя домена, чтобы иметь доступ к тем же данным, что и этот пользователь, в противном случае вы сможете только отправлять запросы к доступным общедоступным данным c. Вы можете выдать себя за каждого пользователя, если вам нужен календарь для каждого.

На примере API Google PHP библиотека вы можете использовать метод setSubject при установке объекта client:

$client->setSubject($user_to_impersonate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...