Javascript: Google Calender + gapi: сервисный аккаунт - PullRequest
0 голосов
/ 16 января 2019

Мое приложение использует Firebase для входа в систему, и у них есть доступ к календарю, который специально создан как единый общий календарь для добавления и удаления резервирований.

Для этого у приложения есть, так сказать, собственный адрес Gmail. Доступ к приложению осуществляется через API Google (клиент gapi).

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

Пока мне удалось:

  • создать сервисный ключ для сервисной учетной записи,
  • поделиться календарем с сервисной учетной записью «фиктивного» пользователя,
  • использовать этот сервисный ключ (сертификат) для создания токена JWT (с использованием библиотеки jsrsasign),
  • сделать запрос POST, чтобы получить токен доступа для gapi,
  • инициализирует авторизацию gapi и клиента и имеет доступ к календарю через gapi

Теперь, когда я дохожу до момента получения событий Календаря Google, я получаю успешный ответ, но массив событий пуст, хотя в общем календаре доступны тестовые события.

Ответ выглядит так:

{
 "kind": "calendar#events",
 "etag": "\"pqef3g4h5j6j0g\"",
 "summary": "my_app_email@appspot.gserviceaccount.com",
 "updated": "2019-01-15T21:14:05.029Z",
 "timeZone": "UTC",
 "accessRole": "owner",
 "defaultReminders": [],
 "items": []
}

В Stackoverflow есть несколько тем, касающихся этого, но ни в одной из них нет полезной информации, или они касаются Pythin / PHP.

Я надеюсь, что кто-то может дать совет с этим для Javascript ...

1 Ответ

0 голосов
/ 20 января 2019

Я решил это ... Проблема была в запросе gapi, при получении событий. Я использовал неправильный calendarId. У меня установлено значение по умолчанию «основной», но фактический использованный ID календаря можно найти в разделе «Настройки Календаря Google» >> «Интегрировать календарь». В моих настройках calendarId был адресом электронной почты связанной учетной записи.

Итак, запрос gapi выглядит следующим образом:

const fetchTimeLimit = new Date(2019, 0, 1).toISOString();

let events = await gapi.client.calendar.events.list({
  calendarId: 'calendar_email@gmail.com',
  timeMin: fetchTimeLimit,
  showDeleted: false,
  singleEvents: true,
  maxResults: 300,
  orderBy: 'startTime'
})
.then(response => {  ........etc
...