Firebaseを使ったサービスでidTokenを自動で取得する方法

Firebase Authorizationを使って開発している時に、idTokenを取得したいと思う時がありました。 普通はFirebase SDKでログインすればidTokenは取得できますが、例えばCIや単体テストなどでわざわざ手動でログインしてidTokenを取得するのはめんどくさいものがあります。

調査したところ、ややわかりにくいですが、実現方法はFirebaseのマニュアルのページに載っていました。
マニュアルに載っている下記の3つの手順

を実行するとidTokenを取得することができます。

(1) 「Firebase Admin SDK を使用したカスタム トークンの作成」

Promiseを使ってサンプルを書き直していますが、下記のような感じでカスタムトークンを取得します。
このカスタムトークンを使ってFirebase Authorizationにアクセスできれば良いのですが、このトークンではアクセスできなかったです。

  getCustomToken(userId, additionalClaims) {
    return new Promise((resolve, reject) =>
      admin.auth().createCustomToken(userId, additionalClaims)
        .then(function (customToken) {
          resolve(customToken);
          return;
        })
        .catch(function (error) {
          reject(null);
          return;
        })
    );
  }

(2) クライアントでのカスタム トークンを使用したログイン

(1)で取得したカスタムトークンでFirebaseにログインします。
ここもPromiseを使ってサンプルを書き直しています。

  executeAuthorization(customToken) {
    return new Promise((resolve, reject) =>
      firebase.auth().signInWithCustomToken(customToken)
        .then(function () {
          resolve(true);
          return;
        }).catch(function (error) {
          reject(false);
          return;
        })
    );
  }

(3) idTokenを取得する。

(2)でログインしたのでカスタムトークンを取得できます。
ここもPromiseを使ってサンプルを書き直しています。

  getIdToken() {
    return new Promise((resolve, reject) =>
      firebase.auth().currentUser.getIdToken(true).then((idToken) => {
        resolve(idToken);
      }).catch((error) => {
        reject(null);
      })
    );
  }

最後に

上記以外にもFirebase SDKやFirebase Admin SDKの設定があるため、サンプルコードを確認してください。
NPMのパッケージとしても公開したので、Node.jsを利用されている方は利用するとCIや単体テストなどで認証を通さないといけない場合に、楽になるのではないかと思います。

サンプルコード