Клиент Google для службы календаря отвечает кодом 404

Цель

Я пытаюсь интегрировать API Календаря Google на веб-сайт моей компании, чтобы автоматизировать создание некоторые события.

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

Что я сделал

  • создал учетную запись службы OAuth 2.0, как описано в Google OAuth 2.0 для межсерверных приложений. документы

  • создал, скачал и добавил файл учетных данных в свой проект и добавил его путь в переменную среды GOOGLE_APPLICATION_CREDENTIALS;

  • следовал примеру документации, чтобы авторизовать мои запросы используя сервисный аккаунт и документы для создания мероприятий.
    Вот короткая версия моего исходного кода:

    $client = new Google_Client();
    $client->setApplicationName("XXX");
    $client->addScope(Google_Service_Calendar::CALENDAR); // "https://www.googleapis.com/auth/calendar"
    $client->useApplicationDefaultCredentials();
    
    $service = new Google_Service_Calendar($client);
    
    $event = new Google_Service_Calendar_Event(/* array with event data */);
    $calendarId = /* calendar id taken from calendar Settings and Sharing on calendar.google.com*/;
    
    $event      = $service->events->insert($calendarId, $event);
    

    По сравнению с примером (строки 43:52) я не стал вручную проверять файлы учетных данных, а пошел прямо к useApplicationDefaultCredentials().

Ошибка

Зарегистрированная ошибка из моего кода

[2020-10-19 14:29:19] local.ERROR: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found"
   }
  ],
  "code": 404,
  "message": "Not Found"
 }
}
 {"userId":2,"exception":"[object] (Google_Service_Exception(code: 404): {
 \"error\": {
  \"errors\": [
   {
    \"domain\": \"global\",
    \"reason\": \"notFound\",
    \"message\": \"Not Found\"
   }
  ],
  \"code\": 404,
  \"message\": \"Not Found\"
 }
}
 at /var/www/vendor/google/apiclient/src/Google/Http/REST.php:123)
[stacktrace]

Похоже, он вызывает неправильную конечную точку API, поскольку 404 является ответом page not found.

Идентификатор календаря
Просто для ясности, вот откуда я взял идентификатор календаря введите здесь описание изображения


person fudo    schedule 20.10.2020    source источник


Ответы (1)


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

Если это внутреннее приложение (и вы являетесь администратором своей организации), вы можете выполнить действия, описанные в разделе Делегирование полномочий для предоставления вашему сервисному аккаунту доступа к календарям вашей организации:

Затем суперадминистратор домена G Suite должен выполнить следующие шаги:

  1. В консоли администратора вашего домена G Suite выберите Главное меню > Безопасность > Управление API.
  2. На панели «Делегирование на уровне домена» выберите «Управление делегированием на уровне домена». Щелкните Добавить новый.
  3. В поле «Идентификатор клиента» введите идентификатор клиента учетной записи службы. Идентификатор клиента вашего сервисного аккаунта можно найти на странице сервисных аккаунтов.
  4. В поле Области OAuth (с разделителями-запятыми) введите список областей, к которым вашему приложению должен быть предоставлен доступ. Например, если вашему приложению требуется полный доступ на уровне домена к API Google Диска и API Календаря Google, введите: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
  5. Щелкните Авторизовать.

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

Если это приложение, предназначенное для установки несколькими организациями, вам следует рассмотреть возможность использования управляемой службы OAuth, например Xkit ( где я работаю). Xkit, в частности, имеет коннектор сервисного аккаунта Календаря Google, который абстрагирует все из этих шагов (включая пошаговое руководство для ИТ-администратора) от вас как разработчика, чтобы предоставить вам рабочий токен доступа в одном вызове API.

В качестве примечания: приведенный вами пример служебной учетной записи использует общедоступные данные из API книг, поэтому ему не требуется авторизация пользователя, ему нужно только идентифицировать себя как приложение.

person Trey Griffith    schedule 20.10.2020
comment
Да, я нашел это здесь, поэтому я ответил на свой вопрос, но сделал это неправильно, поэтому мой собственный ответ заминусовали и отменили ???? - person fudo; 21.10.2020