🌊

Node.jsのGoogleAPIのライブラリの認証部分がCloudflare Workersで使えないので代替を探してみた

2024/12/17に公開

Hono x Cloudflare WorkersでGoogleAPIのライブラリを使用しようとしたら認証時にエラーになったので代替案を探して対処しました。

ざっくりまとめ

  • HonoでGoogleAPIをサービスアカウントの認証を使用してカレンダーのデータを取得したかった
  • 実行環境はCloudflare Workers
  • ライブラリ内のNode.jsの処理がCloudflare Workersで使えないのでエラーが出る
  • Node.jsに依存していない認証処理をしているライブラリ発見
  • ライブラリを使用してカレンダーのデータを取得できた

HonoでGoogleAPIをサービスアカウントの認証で使用してカレンダーのデータを取得したかった

サービスアカウントを作成して以下のように認証処理をしてサクッとライブラリを使いたかったです。

const auth = new google.auth.GoogleAuth({
  credentials: JSON.parse(env.GCP_SERVICE_ACCOUNT),
  scopes: ["https://www.googleapis.com/auth/cloud-platform"],
});

が、これだとGoogleAuth()の内部処理の一部がCloudflare Workersで使えないのでエラーになります。
crypto.createSignが使えないというエラーになります。

cryptoはCloudflareでは部分的にしか使えない状況です。

https://developers.cloudflare.com/workers/runtime-apis/nodejs/crypto/

代替案を探してみる

自分以外にも同じような問題を抱えている人がいたので調べてみました。

https://gist.github.com/markelliot/6627143be1fc8209c9662c504d0ff205

Node.jsに依存していないライブラリを見つけました。

https://github.com/Schachte/cloudflare-google-auth

ライブラリを使用してカレンダーのデータを取得できた

ドキュメント通りにコードを書いて実行したところ、問題なく認証&データ取得ができました。

  const scopes = ["https://www.googleapis.com/auth/calendar.readonly"];
  const googleAuth: GoogleKey = JSON.parse(env.GCP_SERVICE_ACCOUNT);
  const oauth = new GoogleAuth(googleAuth, scopes);
  const token = await oauth.getGoogleAuthToken();
  const calendar = google.calendar({ version: "v3" });
  const res = await calendar.events.list({
    calendarId: env.GOOGLE_CALENDER_ID,
    timeMin: xxx,
    timeMax: xxx,
    singleEvents: true,
    orderBy: "startTime",
    oauth_token: token,
  });

Discussion