はじめに
Google Cloud Functions for Firebaseではなく、pythonコードかつGoogle Cloud Functionsから繋ぎたい時にどうするかという対応方法をまとめました。
Firebaseから認証情報引っ張ってくるとかは書いてないので、他の記事を参考にしてください。
環境
python 3.7で作ったGoogle Cloud Functions
firebase-admin 3.2.1
Google Cloud Functionsでpythonコードを作った時の制限
main.pyとrequirements.txtしか受け付けてくれないようです。
よくあるserviceAccountKey.jsonファイルを読み込んでーという方法ではだめでした。
credentials.Certificateにファイルパスくわせて認証する一般的なやり方ですね。
credentials.Certificateをファイル以外から作成しよう
なので、他の方法を探りました。
まずはAPI仕様書を確認しました。
https://firebase.google.com/docs/reference/admin/python/firebase_admin.credentials
A credential initialized from a JSON certificate keyfile.
ということでkeyファイルからやるやつだよってことらしいです。
ちなみにjavascript側からだとAPI仕様書にファイル以外から受け付けるやり方書いてますので、javascript使ってる方はAPI仕様書をご覧ください。
それじゃどういう処理してるんだろうと思って、ソース見に行きました。
https://github.com/firebase/firebase-admin-python/blob/master/firebase_admin/credentials.py
# 上記URLの81行目から引用
if isinstance(cert, str):
with open(cert) as json_file:
json_data = json.load(json_file)
elif isinstance(cert, dict):
json_data = cert
出来るんかーい。
ということでdict型にして渡してあげればそれで読み込んでくれるようです。
ソース読むもんですね。
それじゃ実装しよう
私の場合はこのコードをgithubで公開しているため、環境変数にserviceAccountKey.jsonの中身をそのまま設定して読み込んでいます。
公開しないよって人はpythonコード内に埋め込んでも大丈夫ですが、これ漏れるとまずいので扱いは気をつけてください。
環境変数部分はpython-dotenvを使っていますが、省略します。
client作成コードを抜き出した版は以下です。
import os
import json
import firebase_admin
from firebase_admin import firestore
from firebase_admin import credentials
cred = credentials.Certificate(json.loads(os.environ.get("FIREBASE_KEY")))
firebase_admin.initialize_app(cred)
db = firestore.client()
依存するライブラリは
firebase-admin
google-cloud-firestore
の2つなので、入れておいてください。
firebase-admin
しかコード上には現れませんが、firebase-admin
がgoogle-cloud-firestore
に依存しているため、2つとも必要です。
おわりに
Google Cloud Functions For Firebaseがpythonに対応しますよーに(そうすれば何も問題はなかった)