FirebaseでID Tokenを生成する

FirebaseでID Tokenを生成する方法です.
Firebase Functionsで認証の仕組みを使った時にこれフロント作らないとデバッグ出来ないのか…?みたいな気持ちになったので生成方法メモしておきます.

必要なもの

  • ウェブ API キー
    プロジェクトの設定の全般から取得できます
  • サービスアカウントの認証情報
    プロジェクトの設定のサービスアカウントから新しい秘密鍵の生成で持ってこれます
  • ログインしたいユーザーのuid
    プロジェクトのAuthenticationのユーザーuidから持ってきます

Functionsはこんな感じのなんか認証情報でアクセス許可したりしなかったりする感じ

 1app.use((req, res, next) => {
 2  const idToken = req.headers.authorization.replace("Bearer ", "");
 3  const decodedToken = await admin.auth().verifyIdToken(idToken);
 4  if (よしなに判定){
 5    // 認証失敗
 6    res.status(401).send("認証いるよ");
 7  } else {
 8    next();
 9  }
10});

ここでBearerヘッダに入れるidTokenってどうやって入手するの…?となるわけですがフロントがあるなら
ログイン認証後に

1const idtoken = await firebase.auth().currentUser.getIdToken();

とかやると取れます(多分

ただフロントは今回全く書いてなかったので使わずに生成する方法です.
まずカスタムトークンが必要になるのでこれを生成します.
https://firebase.google.com/docs/auth/admin/create-custom-tokens?hl=ja
この辺に各言語でのやり方が書いてありますが今回はPythonで説明します.

以下のようなコードを使います.
必要部分は事前に取得したもので埋めて下さい.

 1import firebase_admin
 2from firebase_admin import credentials
 3from firebase_admin import auth
 4
 5# 管理コンソールのサービスアカウントから取得する
 6cred = credentials.Certificate("service_account.json")
 7firebase_admin.initialize_app(cred)
 8
 9# 管理コンソールのアカウント一覧から取得する
10uid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
11
12# ユーザー情報の取得
13user = auth.get_user(uid)
14print(user.uid, user.email)
15
16# カスタムトークンの生成
17token = auth.create_custom_token(uid)
18
19print(token)
20# Firebase Auth REST APIを叩いてID Tokenを生成
21token = input(">>")
22
23# ユーザー情報の取得
24user = auth.verify_id_token(token)
25print(user)

カスタムトークンが表示されたらFirebase Auth Rest APIを使います.
https://firebase.google.com/docs/reference/rest/auth/

1$ curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=[API_KEY]' \
2-H 'Content-Type: application/json' \
3--data-binary '{"token":"[Pythonで取得したカスタムトークン]","returnSecureToken":true}'

レスポンスにあるidTokenが目的のものです.
コンソールでPythonが入力待ちになってるのでここに貼り付けると使えるはずです.

全部Pythonで書けば良かったですけど取り急ぎ試すだけ試したかったので雑ですが以上