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

Если вы не работали с Google API или, по крайней мере, не работали в Node. вы можете быть удивлены, насколько неполна их документация. Насколько сложно было бы интегрировать Google API? Я проанализирую проблемы, с которыми столкнулся в последних частях.

Фон

Здесь, в Code Chrysalis, мы делим студенческий день на элементарные единицы Блока. Каждый блок будет назначен как минимум одному инструктору для выполнения предписанных занятий или лекций.

Мы разрабатываем нашу внутреннюю платформу Monarch для управления расписаниями студентов, репозиториями, списками преподавателей и т. Д. Серверная часть работает на Express.js с GraphQL и TypeORM, полностью написанными на TypeScript.

Помимо Monarch, сотрудники активно используют G-Suite и Google Calendar, чтобы отразить наиболее точное расписание.

В течение первого месяца работы с Code Chrysalis мне приходилось вручную создавать события из моего списка, чтобы отразить мое фактическое расписание в Календаре Google. Для программиста это заноза в заднице. Таким образом, синхронизация нашей платформы с Календарем Google стала моей первой обязательной функцией, которую я должен создать.

Цели

Что я хочу:

  • любое назначение блока должно запускать создание / обновление события в Календаре Google правопреемника;
  • событие также должно быть удалено после любого удаления блока

Реализация

Поскольку мы используем GraphQL, все, что мне нужно сделать, - это добавить ловушку в мой Resolver. Всякий раз, когда блок изменяется, запускается логика обновления соответствующего события Календаря Google.

Вызовы

Требования просты, использование API Google - нет!

Моими основными проблемами были:

Проблема №1: проверка моей учетной записи службы с полномочиями на уровне домена

Google предоставляет механизм аутентификации для межсерверного приложения с использованием служебной учетной записи. Учетная запись службы - это учетная запись, представляющая приложение, а не отдельного пользователя. Это позволяет нашему приложению работать с собственными данными в Google, а не с данными пользователей. Однако с делегированием домена мы можем предоставить нашему сервисному аккаунту доступ к данным участников в организации (при условии, что вы используете G-Suite). Следуя этому руководству, мы предоставили нашему сервисному аккаунту права доступа к календарям в организации.

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

Поэтому я погрузился в документацию google-auth-library-nodejs, пытаясь создать в Node самый тупой код, который мог бы читать мой собственный календарь, но безрезультатно.

После нескольких попыток в Node я решил проверить свои учетные данные с помощью библиотеки Python от Google. Используя это руководство, мне удалось прочитать свой список календарей с несколькими строчками кода в течение нескольких минут.

До этого момента я знаю, что моя учетная запись службы настроена правильно!

Задача № 2: просмотр несуществующей документации

Вот и проблема. Моя учетная запись службы работает, но я не могу найти ничего, связанного с делегированными учетными данными в google-auth-library-nodejs. Чтобы получить доступ к календарю каждого, мне нужно было настроить делегированные учетные данные, как в Python.

Лучшая документация иногда - это сам код.

Я открыл исходный код клиентской библиотеки Python Google и нашел код, который позволяет делегировать учетные данные, устанавливая свойство subject. Однако, похоже, я не нашел ни одного связанного ключевого слова в документации клиента узла. Поэтому я просмотрел исходный код google-auth-library-nodejs и в конце концов понял, как создать делегированные учетные данные в Node.

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

Урок путешествия

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