firebaseのid_tokenによる認証をPythonで行う方法
概要
- firebaseのログイン処理は通常フロントエンドで行い、ユーザーをサーバーサイドで認証するときのデバッグ時などを想定
- サーバーサイドで実装してるとローカルで試すときにfirebaseで発行されるid_tokenがないと認証処理ができなくてデバッグできなくて困ります
- そこでPythonだけでid_token発行してログイン処理できる方法があったのでメモ
手順
python用のfirebase SDKをインストール
pip install firebase-admin
です
GCPの管理画面からfirebaseのサービスアカウントのクレデンシャルをダウンロード
よくあるJSON形式です
環境変数でクレデンシャルのファイルのパスを記述
export FIREBASE_CREDENTIAL_FILE_PATH="[FILE_PATH]"
ユーザーのカスタムトークンを取得
これは認証に用いるid_tokenではないので注意です。
# -*- coding: utf-8 -*- import os import firebase_admin from firebase_admin import credentials from firebase_admin import auth cred = credentials.Certificate(os.getenv('FIREBASE_CREDENTIAL_FILE_PATH')) firebase_admin.initialize_app(cred) # 管理コンソールのアカウント一覧から取得する # uidは任意で書き換える uid = "FIREBASE_UID" # カスタムトークンの生成 token = auth.create_custom_token(uid) print(token)
Firebase Auth REST APIを叩いてid_tokenを生成
API_KEY はfirebaseのコンソールで確認しておきます
curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=[API_KEY]' \ -H 'Content-Type: application/json' \ --data-binary '{"token":"[CUSTOM_TOKEN]","returnSecureToken":true}'
返り値は以下のような感じです
{ "kind": "identitytoolkit#VerifyCustomTokenResponse", "idToken": "[ID_TOKEN]", "refreshToken": "[REFRESH_TOKEN]", "expiresIn": "3600" }
id_tokenが正常に取得できているかどうかはPythonで以下のように確認できます。
# -*- coding: utf-8 -*- import os import firebase_admin from firebase_admin import credentials from firebase_admin import auth cred = credentials.Certificate(os.getenv('FIREBASE_CREDENTIAL_FILE_PATH')) firebase_admin.initialize_app(cred) token = "" #ここにID_TOKENを入れる # ユーザー情報の取得 # id_tokenが正常に取得できているか一応確かめる user = auth.verify_id_token(token) print(user)
id_token使用例
httpリクエスト
APIなどでid_tokenをheaderに入れて認証をするケースだと以下のようなリクエストを送ればよいです。
curl -X POST -H "Content-Type: application/json" -H "Authorization: [ID_TOKEN]" -d '{"type":"task", "status":"doing"}' http://127.0.0.1:80/hoge
Flask appでのAPI実装
# -*- coding: utf-8 -*- from flask import Flask, request import firebase_admin from firebase_admin import auth from firebase_admin import credentials app = Flask(__name__) # firebase admin の初期化 cred = credentials.Certificate(os.getenv('FIREBASE_CREDENTIAL_FILE_PATH')) default_app = firebase_admin.initialize_app(cred) @app.route('/hoge', methods=['POST']) def post_data(): id_token = request.headers.get("Authorization", None) try: firebase_user = auth.verify_id_token(id_token) # 以下、諸々の処理