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での認証でも自動テストできる(*´ω`*)