Golang(v1.11)+HerokuのサーバーサイドでFirebase Authenticationのトークン検証を行った際のTips。
サービスアカウントキーをファイルから読みたくない
Firebase Adimin SDKの初期化で詰まった。
公式ドキュメントのサンプルコードは以下。
import (
"log"
"golang.org/x/net/context"
firebase "firebase.google.com/go"
"firebase.google.com/go/auth"
"google.golang.org/api/option"
)
opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}
serviceAccountKey.json
ファイルを読み込んで初期化を行っているが、このファイルをgit管理することは避けたい。
一方、Herokuではgit管理していないファイルは置けない。
そこで、keyを環境変数にセットしてそこから読ませたい。
環境変数に設定
こちらの記事を参考に、jsonファイルの中身を環境変数にセットする。
環境変数名は任意。
export $FIREBASE_KEYFILE_JSON="$(< ./serviceAccountKey.json)"
heroku環境に設定するには下のコマンドを実行する。
heroku config:set FIREBASE_KEYFILE_JSON="$(< ./keyfile.json)"
環境変数を読みSDK初期化
ドキュメントから使えそうな関数を探す。
CredentialsFromJSON
を使えば良いっぽい。
credentials, err := google.CredentialsFromJSON(ctx, []byte(os.Getenv("FIREBASE_KEYFILE_JSON")))
初期化コード全体としては以下。
credentials, err := google.CredentialsFromJSON(ctx, []byte(os.Getenv("FIREBASE_KEYFILE_JSON")))
if err != nil {
log.Printf("error credentials from json: %v\n", err)
}
opt := option.WithCredentials(credentials)
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
log.Printf("error initializing app: %v\n", err)
}
トークン検証
初期化さえ済んでしまえば後はドキュメント通りにコードを書けば良い。
client, err := app.Auth(ctx)
if err != nil {
log.Printf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Printf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)