現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

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実装

リクエストを受け取る側の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)
        # 以下、諸々の処理