Node.js で Google サービスアカウント JWT を自作する

googleapis npm パッケージは、Google API の標準です。

動作はしますが、プロジェクトに 380KB の容量と 450 個以上の依存関係を追加してしまいます。

CI スクリプトのために 1 つの API が必要なだけであれば、これほど重いものは必要ありません。

わずか 60 行のコードで、URL のインデックス状況を確認するスクリプトを作成しました。

以下の 3 つの Node.js 組み込みモジュールのみを使用しています:

  • crypto
  • fetch
  • URL

リポジトリにパッケージを追加することはありません。

Google サービスアカウントの認証は、RFC 7523 標準に従っています。

手順は以下の通りです:

  • クライアントのメールアドレスと秘密鍵を使用して JWT を作成する。
  • その JWT を Google のトークンエンドポイントに POST する。
  • アクセストークンを受け取る。
  • そのトークンを API リクエストのヘッダーで使用する。

重要な詳細:webmasters スコープを使用してください。新しい searchconsole スコープは、URL Inspection API では動作しません。

JWT には Base64url エンコーディングを使用する必要があります。標準の Base64 では、以下の 3 つの変更が必要です:

  • パディングを削除する。
  • +- に置換する。
  • /_ に置換する。

Google Cloud から取得した秘密鍵は、すでに正しい形式になっています。トークンに署名するために外部ライブラリを使用する必要はありません。

トークンエンドポイントを呼び出す際は、エラーレスポンスをログに記録してください。Google は、トークンの期限切れやサービスアカウントの不足など、失敗の具体的な理由を提供しています。

API コール自体については:

  • Authorization ヘッダーを Bearer [token] に設定する。
  • siteUrl が Search Console のプロパティと完全に一致していることを確認する。
  • Search Console のユーザーとして、サービスアカウントのメールアドレスを追加する。

このアプローチは、CI パイプラインのような限定的なタスクに最適です。

以下のような場合には使用しないでください:

  • 複数の Google API を使用する場合。
  • トークンの自動リフレッシュが必要な場合。
  • 複雑なリトライロジックが必要な場合。
  • 高い複雑性が求められる本番サーバー用のコード。

単一の CI タスクであれば、450 個の依存関係よりも 60 行のコードの方が優れています。また、この生のフローを理解しておくことで、ライブラリが失敗した際のデバッグも容易になります。

ソース: https://dev.to/morinaga/rolling-a-google-service-account-jwt-in-nodejs-without-the-googleapis-package-22am