У меня есть приложение php в моей интрасети, которому нужно добавлять события в календари моих пользователей.

Я следовал следующей инструкции https://developers.google.com/+/domains/authentication/delegation

Я установил клиент google-api-php и использовал пример service-accounts.php в качестве отправной точки.

$client_id = 'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr.apps.googleusercontent.com';
$service_account_name = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy@developer.gserviceaccount.com';
$key_file_location = 'file.p12';

$client = new Google_Client();
$client->setApplicationName("egw - intranet");
$service = new Google_Service_Calendar($client);
//authenticate
if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/calendar'),
    $key
);
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();

$event = new Google_Service_Calendar_Event();
$event->setSummary('API V3 TEST');
$event->setLocation('rrrrrrrrrrrrrrrrrrrrrrrrr');
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime('2014-11-03T10:00:00.000-07:00');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime('2014-11-04T10:25:00.000-07:00');
$event->setEnd($end);
$attendee1 = new Google_Service_Calendar_EventAttendee();
$attendee1->setEmail('email@domain.com');

$attendees = array($attendee1);
$event->attendees = $attendees;
$createdEvent = $service->events- >insert('email2@domain.com', $event);

echo $createdEvent->getId();

Я получаю 404 ошибка не найдена. Если я вручную делюсь календарем, который использую для своего теста, с учетной записью службы, это работает. Но я хотел бы, чтобы моя программа также работала без ручного обмена каждым календарем всех моих пользователей. Может кто-нибудь сказать мне, что мне не хватает?

С уважением,

2
Carl 7 Ноя 2014 в 16:51
Вы правильно настроили области в консоли администратора? У вас должен быть вот такой: googleapis.com/auth/calendar.
 – 
luc
9 Ноя 2014 в 00:13
Да, у меня есть область googleapis.com/auth/calendar.
 – 
Carl
10 Ноя 2014 в 11:37

2 ответа

Вы не можете добавить в календарь мероприятие, которое не было специально предоставлено вашему проекту Google. Вы должны либо поделиться каждым календарем с учетной записью службы, либо использовать OAuth2 с учетными данными веб-приложения, чтобы каждый пользователь мог предоставить вам доступ.

0
Keith Rockhold 18 Ноя 2014 в 00:38
Разве не именно поэтому в домене приложения существуют «служебные учетные записи»?
 – 
Mutmatt
23 Ноя 2014 в 21:34
Учетная запись службы просто позволяет вашему приложению идентифицировать себя в Google. Владелец учетной записи по-прежнему должен предоставить приложению разрешение на доступ к своему календарю. В календаре, который вы хотите изменить, перейдите в «Настройки» -> «Календари» -> «Поделиться этим календарем». Введите адрес электронной почты (имя учетной записи службы) из своей учетной записи службы и дайте ему разрешение «вносить изменения в события». Убедитесь в этом и нажмите кнопку «Сохранить» внизу страницы. Если ваш код правильный, и на первый взгляд кажется, что он добавит события.
 – 
Keith Rockhold
24 Ноя 2014 в 01:11
Если администратор домена разрешил доступ к календарям на уровне домена, не должен ли он также «автоматически» предоставлять доступ к учетной записи службы? Документация API по этой информации далека от полной и вряд ли полезна.
 – 
Mutmatt
24 Ноя 2014 в 01:13
Теоретически вы можете обновить весь список пользователей доменов, следуя этим инструкциям: support.google. com/a/answer/60765?hl=ru Используйте API-интерфейс каталога вместо API-интерфейса Provisioning API для получения списка пользователей.
 – 
Keith Rockhold
24 Ноя 2014 в 02:27

Когда я начал это, текущий клиент google-php-api-client был 1.1.0-beta. Несколько недель спустя мы достигли версии 1.1.2. Обновление до этой версии решило мою проблему. Добавление сервисной учетной записи дает приложению возможность идентифицировать себя с Google. Если вы добавите области в консоль администратора Google, как это сделал я, учетная запись службы будет иметь доступ ко всем данным, указанным в области для каждого пользователя в домене. Спасибо всем за ответы.

0
Carl 26 Ноя 2014 в 12:26