Firebase Admin SDKのgetAuth().getUsers()とGoogle Cloud APIレートリミットの対応

2024/07/31

author

masyus

業務でNode.jsにてバッチ処理を作り、Firebase Admin SDKをインストールしてFirebase Authenticationに記録されているユーザー情報を抽出するプログラムを書いたことがあります。

その際、バッチ処理につきgetAuth().getUsers()をどの頻度で呼び出し続けても良いか(おそらく裏でGoogle CloudのAPIを呼び出している筈)が気になったため調べたのですが、今回はその調べ方について紹介いたします。

バージョン情報

  • node: v20.11.1
  • fierbase-admin: v12.2.0

Identity Toolkit API の上限を把握する

ざっとGoogle検索してまず辿り着いたのが、Firebase ドキュメントが提供している「Identity Toolkit API の上限」というページです。Firebase Admin SDKからのAuthenticationに関連するAPI呼び出しのレートリミットは、おおよそこのページにリストアップされています。

リストアップされているどのオペレーションが今回知りたいgetAuth().getUsers()のレートリミットに対応するかですが、なんとなく

1 プロジェクトあたり GetAccountInfo 件* リクエスト 500,000 件/分

が該当しそうかも?というところまで掴めればひとまずOKです。このページからはこれ以上の情報が収集できなさそうなので、次はより当てがつけやすい調査をしていきます。

Firebase Admin SDKのソースコードを読む

次にFirebase Admin SDKのソースコードを実際に読んでいきましょう。Firebase Admin SDKのソースコードはGitHub上から確認することができます。

https://github.com/firebase/firebase-admin-node

このリポジトリ内で、getUsers()でGitHub上のソースコードを検索してみます。GitHub画面上にある「Type / to search」という検索窓にてgetUsers(と打ち込み、Enterを押して検索してみます。

この時、getUsers()が引数を持つメソッドである可能性を踏まえ、敢えて後方の閉じ括弧を削ぎ落としたgetUsers(で検索するのがポイントです。

getUsers()を特定する

https://github.com/search?q=repo%3Afirebase%2Ffirebase-admin-node+getUsers%28&type=code

↑が検索結果です。こちらによると、2024年7月現在は4ファイルが該当しました。

  • etc/firebase-admin.auth.api.md
  • src/auth/base-auth.ts
  • test/integration/auth.spec.ts
  • test/unit/auth/auth.spec.ts

ざっと眺めてみると、2.のsrc/auth/base-auth.tsにある

  public getUsers(identifiers: UserIdentifier[]): Promise<GetUsersResult> {

が該当しそうです。他の3ファイルはそれぞれ

  • (.*).mdはfirebase-admin.authの利用者向けの解説ファイル
  • (.*).spec.tsはおそらくユニットテストのファイル

だと分かりますので、対象外として良いでしょう。

getAccountInfoByIdentifiers()の中身

次に、getUsers()の中で何のAPIを呼び出しているかを把握します。base-auth.tsの337行目で

    return this.authRequestHandler
      .getAccountInfoByIdentifiers(identifiers)

というメソッドを呼び出しているので、その中身を確認していきます。

https://github.com/firebase/firebase-admin-node/blob/v12.2.0/src/auth/auth-api-request.ts#L1177

ざっと見た限り、このメソッドではAPI呼び出し処理が見つかりませんでした。おそらく1204行目にある

    return this.invokeRequestHandler(this.getAuthUrlBuilder(), FIREBASE_AUTH_GET_ACCOUNTS_INFO, request);

をさらに辿る必要がありそうです。

ここで1点気にしておきたいのが、invokeRequestHandler()の第二引数で渡しているFIREBASE_AUTH_GET_ACCOUNTS_INFOという定数名です。Identity Toolkit APIの上限ページに記載されていた

プロジェクトあたり GetAccountInfo 件

の内容とマッチしていそうです。invokeRequestHandler()は汎用的なメソッドのように見受けられるため、次はメソッドを辿るのではなくFIREBASE_AUTH_GET_ACCOUNTS_INFOの定数を検索してみましょう。

FIREBASE_AUTH_GET_ACCOUNTS_INFOの中身

https://github.com/firebase/firebase-admin-node/blob/v12.2.0/src/auth/auth-api-request.ts#L667

export const FIREBASE_AUTH_GET_ACCOUNTS_INFO = new ApiSettings('/accounts:lookup', 'POST')

API呼び出し設定が見つかりました。/accounts:lookupのPOSTとありますので、コードの深掘りは一旦止めて次にGoogle検索で「Google Cloud accounts:lookup」のキーワードで検索してみます。

Google CloudのAPIドキュメントを特定する

https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts/lookup

ヒットしたのは↑のページです。HTTP Requestの項目を見ると

POST https://identitytoolkit.googleapis.com/v1/projects/{targetProjectId}/accounts:lookup

と解説されていますので、このAPI解説ページで間違いないでしょう。こちらのドキュメントの下部にResponse Bodyという解説があるのでそちらを読むと、

If successful, the response body contains an instance of GetAccountInfoResponse.

とあります。やはりGetAccountInfoが該当するようです。

結論: GetAccountInfoのレートリミットが該当する

即ち、

1 プロジェクトあたり GetAccountInfo 件* リクエスト 500,000 件/分

が該当するレートリミットであることが特定できました。Firebase Admin SDKの他のメソッドも同様に調べていけば、どのレートリミットが対応しているかを特定できそうです。

参考

Firebaseの関連記事

まだ記事がありません