14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Firebase Admin Python SDKでサービスアカウントのAccessTokenを取得する

Last updated at Posted at 2017-04-12

追記

2017年5月17日にFirebase Admin Python SDK v2.0.0がリリースされ、一部の呼び出し方法が異なっていたので補足として追記しています。

概要

2017年4月4日(日本時間だと4/5早朝ごろ)にGoogle公式からPythonのFirebase SDKがリリースされました。正式名称は「Firebase Admin Python SDK」で、その名の通りAdmin周りのAPIがサポートされているSDKになります。

Release Notes  |  Firebase

Firebase Admin Python SDK でできること

その名の通り(二度目)Admin周りの処理が提供されています。とは書いたものの、リファレンスやガイドを読んだところ現在用意されている機能は「サービスアカウントの秘密鍵からCustomTokenやAccessTokenを作る部分のみ」のようです。

使い方

Add the Firebase Admin SDK to your Server  |  Firebase

上記に書いてある内容をそのままなぞっていきますが、そのままだと詰まる箇所があるので要注意

まず初めに、秘密鍵を取得します。
Firebaseのコンソールサイト( https://console.firebase.com/ )から該当のプロジェクトを開き、メニューのOverview横にある歯車>プロジェクトの設定>サービスアカウントまで移動し、画面下部にある「新しい秘密鍵を生成」ボタンを押してjsonファイルを取得します。

そして必要なライブラリをpipでインストールしておきます。

$ pip install firebase-admin

コードはこんな感じです。

v1.0.0

getToken.py

import firebase_admin
from firebase_admin import credentials

def getToken:

    credential = credentials.Certificate('./serviceAccountKey.json')
    scopes = [
        'https://www.googleapis.com/auth/firebase.database',
        'https://www.googleapis.com/auth/userinfo.email'
    ]

    # access_tokenの取得
    accessTokenInfo = credential.get_credential().create_scoped(scopes).get_access_token()
    print("access_token:" + accessTokenInfo.access_token)
    print("expire:" + str(accessTokenInfo.expires_in))

if __name__ == '__main__':
    getToken()

公式のドキュメントとの違いは、firebase_admin.initialize_app()を使わずにcredentialにスコープを設定し、そのままAccessTokenを取得するようになっています。

v2.0.0

getToken.py
import firebase_admin
from firebase_admin import credentials

def getToken:

    credential = credentials.Certificate('./serviceAccountKey.json')

    # access_tokenの取得
    accessTokenInfo = credential.get_access_token()
    print("access_token:" + accessTokenInfo.access_token)
    print("expire:" + str(accessTokenInfo.expiry)) # 「20XX-XX-XX XX:XX:XX.XXXXXX」が返る

if __name__ == '__main__':
    getToken()

v1.0.0との違いはget_credential()でクレデンシャル情報を一度取得する必要や、スコープの設定をする必要がなくなりました。
また、有効期限の内容がv1.0.0は残り時間の秒数だったのに対し、v2.0.0からはプロパティ名がexpiryとなり、利用可能な期限がdatetimeオブジェクトで返ってくるようになっています。

取得したtokenでRealtime Databaseにアクセス

RealtimeDatabaseで利用する場合は、パラメータのaccess_tokenに入れることでアクセスができるようになります。なお、このAccessTokenはサービスアカウントによって作られているため、 データベースのルールで全ユーザーがfalseになっているものも全て読み書きが可能となるので、扱いには注意しましょう。 ちなみにトークンの有効期限は発行から1時間です。

https://{FIREBASE_PROJECT_ID}.firebaseio.com/hoge.json?access_token={FIREBASE_ACCESS_TOKEN}

CustomTokenに関しても同様のやり方で取得できるかとは思いますが、AccessTokenの取得が正しくできた時点で自分にとって必要なものではなくなったので、未検証のままです。

14
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?