Створення Google Service Account JWT у Node.js

Більшість розробників використовують npm-пакет googleapis для виклику Google API. Він працює добре. Але він також додає 380 КБ та понад 450 залежностей до вашого проєкту.

Якщо вам потрібен лише один API для простого CI-скрипта, це надмірне рішення.

Я створив скрипт для перевірки статусу індексації URL, використовуючи лише три вбудовані модулі Node.js: crypto, fetch та URL. Він не використовує жодних зовнішніх пакетів.

Аутентифікація відповідає RFC 7523. Ось як це зробити:

  • Створіть JWT, використовуючи email вашого сервісного акаунта та приватний ключ.
  • Відправте цей JWT методом POST на endpoint токенів Google.
  • Отримайте короткостроковий access token.
  • Використовуйте цей токен як Bearer-заголовок для ваших API-запитів.

JWT потребує таких claims:

  • iss: email вашого клієнта.
  • scope: webmasters.readonly.
  • aud: URL токенів Google.
  • iat: поточний час.
  • exp: поточний час плюс 3600 секунд.

Примітка: Використовуйте scope webmasters. Новіший scope searchconsole не працює для URL Inspection API.

Найскладніша частина — це Base64url-кодування. Ви повинні видалити padding та замінити символи, щоб зробити його сумісним. Ви можете використовувати модуль node:crypto, щоб підписати JWT вашим приватним RSA-ключем. Ключ із вашого JSON-файлу Google Cloud працює безпосередньо.

Під час обміну токена логуйте сиру відповідь про помилку. Google надає конкретні повідомлення, наприклад "Service account not found". Це допоможе вам швидко виправляти помилки.

Цей підхід найкраще працює, коли:

  • Ви використовуєте один API у CI-пайплайні.
  • Ви хочете, щоб ваш репозиторій був легким.
  • Ви хочете зрозуміти процес автентифікації.

Не використовуйте це, якщо:

  • Ви викликаєте багато різних Google API.
  • Вам потрібне автоматичне оновлення токенів.
  • Ви створюєте великий продакшн-сервер.

Невеликий, читабельний код кращий за сотні прихованих залежностей для вузькоспеціалізованих завдань.

Джерело: https://dev.to/morinaga/rolling-a-google-service-account-jwt-in-nodejs-without-the-googleapis-package-22am