くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Firebase AuthのidTokenをブラウザを使わずに取得する

Firebase Authに認証は全部任せて、APIサーバを立てたいなと、
いろいろ調べてみたときの備忘録(*´ω`*)

Firebase AuthのidTokenをAPIサーバのAccess Tokenを扱い、
サーバー側でidTokenの検証をして、UIDを取得する

サーバの認証処理

サーバ側の処理はこんな感じ。
verifyIdTokenを使って検証する

import { cert, initializeApp } from "firebase-admin/app";
import { getAuth } from "firebase-admin/auth";
// サービスアカウントの秘密鍵
import serviceAccount "path/to/serviceAccountKey.json";

// firebase-adminの初期化
const adminApp = initializeApp({
  credential: cert(serviceAccount)
});
// Firebase Authの取得
const auth = getAuth(adminApp);

// idTokenを検証してUIDを取得
export async function findUidByIdToken(idToken: string) {
  const checkRevoked = false;
  const { uid } = await auth.verifyIdToken(idToken, checkRevoked);
  return uid;
}

テスト用にローカルでIdTokenを生成する

これでidTokenをつかった認証ができるけど、
idTokenはAdmin SDKでは生成できず、
ClientSDKを使わないといけない。。

毎回ブラウザ経由でテストするのは大変なので、
ローカルでidTokenを生成できるようにしたい。

AdminSDKとClientSDKを両方組み合わせ、
カスタムトークン認証を使うことで、できそうな感じ。

実際のコードはこんな感じ。各SDKの初期化は省略。

import { getIdToken, signInWithCustomToken } from "firebase/auth";

const adminAuth  = // AdminSDK(firebase-admin/auth)のAuth
const clientAuth = // ClientSDK(firebase/auth)のAuth

// UIDからidTokenの取得
export async function getIdTokenByUid(uid: string) {
  // Adminで、カスタムトークンの生成
  const customToken = await adminAuth.createCustomToken(uid);
  
  // Clientで、カスタムトークン認証
  const { user } = await signInWithCustomToken(clientAuth, customToken);
  
  // Clientで、idTokenの取得
  const idToken = await getIdToken(user, false);

  return idToken;
}

以上!! これでidTokenでの認証でも自動テストできる(*´ω`*)