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

После многих головных болей я проконсультировался с другим разработчиком, у которого был некоторый опыт использования OAuth2 и API Google. (Обязательно ознакомьтесь с его статьей на Medium о Node.js, OAuth2 и Gmail здесь!) Убедитесь, что у вас установлен NPM, прежде чем начинать это руководство.

Решив эту проблему, я наконец смог получить свою облачную функцию Firebase для быстрого добавления событий в мой основной календарь Google через триггер HTTP с минимальными деталями в теле запроса. Репозиторий (без файла OAuth2 credentials.json) с кодом, использованным для создания нашей облачной функции, можно найти здесь.

Часть 1. Настройка приложения Firebase

Очевидно, что первое, что нам нужно, - это создать приложение Firebase. Это можно сделать через Консоль разработчика Google и интегрировать Firebase в ваше приложение позже, но я буду использовать Консоль Firebase. После входа в свою учетную запись Google вы должны получить список всех своих проектов Firebase и кнопку Добавить проект. Когда вы нажмете Добавить проект, вам будет предложено ввести данные вашего проекта.

Имя проекта может быть любым, но идентификатор проекта должен быть уникальным для всех проектов Google. Как вы можете видеть выше, мой идентификатор проекта - calendar-cloud-function, но в оставшейся части статьи я буду использовать PROJECT_ID как указание на замену с вашим конкретным идентификатором проекта Firebase.

Обязательно примите все условия в окне. После этого нажмите Создать проект, чтобы завершить создание проекта Firebase. Этот процесс займет несколько секунд, прежде чем будет подтверждено, что ваш проект действительно был успешно создан. Затем вы можете войти в свой проект Firebase.

ПРИМЕЧАНИЕ. За кулисами в консоли разработчика Google также создается проект, который будет использоваться позже.

Если мы перейдем на вкладку Функции слева в разделе Разработка, мы увидим нашу панель управления, на которой будут размещаться наши облачные функции.

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

Часть 2: Инициализация нашего проекта Firebase

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

Откройте командную строку и перейдите в рабочую область, в которой вы хотите разместить свой проект. Запустите mkdir PROJECT_ID, чтобы создать каталог с тем же именем, что и ваш проект Firebase, и cd в новый каталог.

Сначала вам нужно загрузить интерфейс командной строки Firebase с npm install -g firebase-tools. После установки войдите в свою учетную запись Firebase с помощью команды firebase login. Это предоставит CLI доступ к вашей учетной записи, чтобы вы могли управлять кодом и развертывать его в определенных проектах Firebase.

Интерфейс командной строки Firebase также предоставляет полезные инструменты для инициализации кода для определенных продуктов Firebase. Запустите firebase init, чтобы начать настройку архитектуры проекта для вашей облачной функции.

В этом руководстве мы работаем только с облачными функциями Firebase. Выберите Функции для настройки вашего проекта и нажмите клавишу ВВОД, чтобы продолжить инициализацию вашего проекта.

Затем интерфейс командной строки Firebase захочет узнать, с каким проектом вы хотите связать облачную функцию. Выберите правильный PROJECT_ID для проекта Firebase и нажмите клавишу ВВОД.

После нажатия Enter вам будет предложено написать облачную функцию на JavaScript или TypeScript. Не стесняйтесь выбирать, но код для этого руководства был написан на JavaScript. Продолжите настройку остальной части проекта. Для простоты использования в дальнейшем обязательно установите зависимости npm и линтер во время инициализации проекта.

После загрузки зависимостей npm ваш проект Firebase должен быть создан и готов к использованию. Откройте корневой каталог в вашей любимой среде IDE, и мы можем приступить к написанию кода!

Ваш проект должен иметь следующую архитектуру. Если вы включили линтер для своего проекта, нам нужно будет внести незначительные изменения в firebase.json файл в корневом каталоге.

В массиве predeploy измените строку "npm --prefix \"RESOURCE_DIR\" run lint" на "npm --prefix functions run lint". Теперь весь файл должен выглядеть следующим образом:

{
  "functions": {
    "predeploy": [
      "npm --prefix functions run lint"
    ]
  }
}

В нашем index.js файле вы должны увидеть закомментированный код. На этом этапе давайте раскомментируем функцию helloWorld и развернем ее в Firebase, чтобы убедиться, что все настроено правильно. После комментирования функции index.js должно выглядеть так:

Это вернет сообщение «Привет от Firebase!» когда выполняется облачная функция. В командной строке запустите firebase deploy --only functions в корневом каталоге проекта. Развертывание займет ~ 1 минуту, но должно завершиться успешно. В случае успеха вернитесь на панель управления Firebase вашего проекта и увидите нашу недавно созданную helloWorld функцию, указанную на панели инструментов Функции с конечной точкой HTTP для триггера.

Скопируйте конечную точку HTTP и вставьте ее в новую вкладку браузера. Это выполнит вашу функцию, и вы получите сообщение «Привет от Firebase!» ответное сообщение. Это означает, что ваш проект настроен правильно и теперь в нем развернута облачная функция!

Эта функция не так много, но возможности того, что она может делать, безграничны. В этом руководстве мы будем работать с Google Calendar API (v3). У Google есть сотни других доступных API, и я рекомендую вам проверить их, как только вы закончите работу с этой статьей. Для работы с API Google сначала необходимо настроить наши учетные данные OAuth2. Это позволит аутентифицировать вашу функцию при взаимодействии с API Google.

Часть 3. Создание учетных данных API календаря

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

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

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

Вы можете увидеть предупреждающий баннер в верхней части страницы, в котором говорится:

Чтобы создать идентификатор клиента OAuth, необходимо сначала указать название продукта на экране согласия.

Чтобы исправить это, нажмите кнопку Настроить экран согласия в предупреждении и выберите название для своего «продукта». После того как вы присвоите своему продукту имя, вам может потребоваться выбрать адрес электронной почты для поддержки по электронной почте, прежде чем кнопка «Сохранить» станет активной. После включения нажмите Сохранить, чтобы перейти к экрану создания идентификатора клиента OAuth.

На экране учетных данных выберите Веб-приложение в разделе Тип приложения, чтобы отобразить другие критерии, необходимые для учетных данных OAuth. Назовите идентификатор клиента OAuth значимым, чтобы вы могли отслеживать учетные данные для своего проекта.

В разделе URI авторизованного перенаправления в разделе Ограничения добавьте URI https://developers.google.com/oauthplayground. После добавления URI перенаправления щелкните в любом месте за пределами ввода, чтобы убедиться, что URI введен правильно. Если все в порядке, нажмите кнопку Создать внизу!

Если ваши учетные данные клиента OAuth были успешно созданы, вы будете перенаправлены обратно на экран учетных данных со следующим активным окном предупреждения:

Если вы нажмете ОК, вы должны увидеть учетные данные, перечисленные в разделе Идентификаторы клиента OAuth2.0 на странице «Учетные данные».

В правом столбце вашего идентификатора клиента находится значок загрузки. Это загрузит файл JSON с учетными данными клиента OAuth. Файл должен содержать следующие данные:

{  
   "web":{  
      "client_id":"CLIENT_ID.apps.googleusercontent.com",
      "project_id":"PROJECT_ID",
      "auth_uri":"https://accounts.google.com/o/oauth2/auth",
      "token_uri":"https://www.googleapis.com/oauth2/v3/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_secret":"CLIENT_SECRET",
      "redirect_uris":[  
         "https://developers.google.com/oauthplayground"
      ]
   }
}

Переименуйте этот файл в credentials.json и сохраните его в том же каталоге, что и файл index.js для проекта, который вы создали в Части 2.

Часть 4: Настройте OAuth2 для вашего проекта

Теперь, когда у нас есть учетные данные клиента OAuth, нам нужно будет перейти к нашему URI перенаправления и настроить OAuth2. Для этого перейдите на https://developers.google.com/oauthplayground. На странице нажмите значок Настройки в правом верхнем углу экрана, чтобы открыть настройки конфигурации. Выберите Использовать собственные учетные данные OAuth внизу, чтобы отобразить данные для только что созданного идентификатора клиента / секрета клиента.

После ввода идентификатора клиента и секрета клиента из вашего credentials.json файла, созданного в Части 3, оставьте указанное выше окно открытым. В левой части экрана найдите Calendar API v3 и выберите соответствующую область действия, которую должна иметь ваша облачная функция.

Поскольку мы хотим, чтобы наше приложение управляло / редактировало / считывало ваш Календарь Google, выберите область https://www.googleapis.com/auth/calendar для полного доступа для чтения / записи. После выбора этой области нажмите Авторизовать API в нижней части шага 1.

Вы попадете на страницу входа в Google, где войдете в аккаунт Google, календарь которого хотите получить. После входа в систему вам будет предложено подтвердить доступ к вашим учетным данным для управления календарями Google. Подтвердите это сообщение, чтобы продолжить. Это перенаправит вас на шаг 2 формы OAuth2 Playground.

Вы должны ввести код авторизации. Этот код действителен только в течение короткого периода времени (точно 3600 секунд). Пока он активен, вам нужно будет нажать Обменять код авторизации на токены, чтобы заполнить токен обновления, который мы сможем использовать позже в нашей облачной функции.

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

Вот так! Теперь у вас есть OAuth2, настроенный для вашей облачной функции, так что токен обновления, идентификатор клиента, секрет клиента могут предоставить вам действительный токен доступа при работе с Google Calendar API. Если вы инициализируете этот проект как репозиторий Git, обязательно укажите credentials.json в своем .gitignore файле, чтобы случайно не добавить свои учетные данные в общедоступный репозиторий.

Часть 5. Напишите облачную функцию для взаимодействия с Календарем Google

Теперь, когда у нас настроен OAuth2 для Google Calendar API, мы можем начать писать код для взаимодействия с ним! Для этого перейдите к своему проекту в командной строке и перейдите в папку functions, в которой находится ваш package.json. Там запустите npm i googleapis --save, чтобы установить необходимые инструменты Google API Node.js.

Первым делом мы импортируем все необходимые пакеты, которые мы будем использовать. Заполненный код для index.js можно найти здесь. Мы поместим это в начало нашего файла перед любыми методами, которые мы напишем позже. Убедитесь, что credentials.json находится в той же папке, что и index.js, иначе путь потребуется обновить.

Затем мы начнем писать нашу функцию Firebase. Во второй части этого руководства мы написали helloWorld() функцию Firebase. Мы заменим это следующим addEventToCalendar() методом.

Параметры request и response действуют как точки входа и выхода для нашей облачной функции, чтобы взаимодействовать с Firebase и пользователем. request будет иметь данные, необходимые для создания нашего календарного события, и мы создаем это событие в первой строке функции, сохраняя его в eventData.

Затем мы используем наш импортированный googleCredentials, чтобы создать oAuth2Client объект со всеми учетными данными, которые нам нужны, чтобы подтвердить нас как правильного пользователя. Затем мы устанавливаем refresh_token для oAuth2Client учетных данных, чтобы у нас был новый токен при доступе к Google Calendar API.

Наконец, мы вызываем метод addEvent(), который еще не был написан, передавая ему сведения eventData и oAuth2Client, ожидая либо успеха, либо сбоя. Как только любой из них получен, мы передаем подробности того, что произошло, обратно пользователю с параметром response, заданным Firebase.

Последний метод, который нам нужно написать, - это ссылка на метод addEvent() выше. Полный метод приведен ниже:

Как упоминалось ранее, мы передали событие календаря и аутентификацию, которые были созданы в начальной addEventToCalendar() функции Firebase. Затем мы используем API Календаря Google, ссылаясь на объект calendar, который мы создали ранее. Полный API для Google Calendar можно найти здесь. В случае успеха мы передаем вновь созданные данные календарного события обратно в Promise с сообщением Успешно, которое будет обрабатываться функцией Firebase, которую мы создали выше.

Вот и все! Теперь функция Firebase завершена. Как и раньше, мы развернем эту функцию, запустив команду firebase deploy --only functions в корневом каталоге проекта. Через минуту или две интерфейс командной строки Firebase сообщит, что облачная функция развернута.

Часть 6: Выполнение вашей облачной функции

После того, как ваша функция развернута, перейдите в Консоль разработчика Google и перейдите к своему проекту Firebase. В меню слева выберите Облачные функции из списка. Там вы должны увидеть только что созданную функцию Firebase на панели инструментов Cloud Functions. Щелкните функцию addEventToCalendar, чтобы получить о ней дополнительную информацию.

Здесь вы должны увидеть четыре вкладки для своей облачной функции: Общие, Триггер, Источник и Тестирование. Ознакомьтесь с каждым из них, чтобы узнать больше о своей функции, включая конечную точку триггера HTTP.

Но мы начнем с вкладки Тестирование. Здесь вы увидите следующие варианты ввода:

Пустой объект {} JSON - это тело вашего запроса. Если вы помните, мы получаем доступ к нескольким элементам этого тела запроса в нашей облачной функции для создания календарного события. Из-за этого нам нужно будет заменить Triggering Event чем-нибудь вроде:

{
  "eventName": "Firebase Event",
  "description": "This is a sample description",
  "startTime": "2018-12-01T10:00:00",
  "endTime": "2018-12-01T13:00:00"
}

Нажмите Проверить функцию, чтобы вызвать функцию Firebase с указанным выше телом запроса. Если все верно, вы должны получить ответ с подробностями о вашем новом мероприятии. Если вы перейдете в Календарь Google, вы сможете увидеть свое мероприятие именно там, где оно должно быть.

Заключение

Вот и все, у нас официально развернута облачная функция Firebase, которая будет создавать события в вашем календаре с минимальной информацией, необходимой в теле запроса. Эта функция имеет конечную точку HTTP, поэтому она может быть задействована несколькими различными методами.

Дальнейшая работа может включать использование Alexa / Google Home для вызова этой конечной точки HTTP после добавления определенных голосовых подсказок. Кроме того, ваше взаимодействие с Calendar API может быть расширено за счет удаления событий, изменения существующих, чтения событий, происходящих сегодня, и т. Д. Следующим шагом может стать безопасность вашей облачной функции, чтобы вы были уверены, что только вы и ваши службы можете вызывать вашу облачную функцию.

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