Go
Heroku
golang
Firebase
FirebaseAuthentication

GolangでFirebase Service Account Keyを環境変数から読み込む

Golang(v1.11)+HerokuのサーバーサイドでFirebase Authenticationのトークン検証を行った際のTips。

サービスアカウントキーをファイルから読みたくない

Firebase Adimin SDKの初期化で詰まった。
公式ドキュメントのサンプルコードは以下。

https://firebase.google.com/docs/admin/setup?hl=ja

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を環境変数にセットしてそこから読ませたい。

環境変数に設定

https://qiita.com/saicologic/items/3a7596b2558713a7e8fc

こちらの記事を参考に、jsonファイルの中身を環境変数にセットする。
環境変数名は任意。

export $FIREBASE_KEYFILE_JSON="$(< ./serviceAccountKey.json)"

heroku環境に設定するには下のコマンドを実行する。

heroku config:set FIREBASE_KEYFILE_JSON="$(< ./keyfile.json)"

環境変数を読みSDK初期化

ドキュメントから使えそうな関数を探す。

https://godoc.org/golang.org/x/oauth2/google#example-CredentialsFromJSON

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)
}

トークン検証

初期化さえ済んでしまえば後はドキュメント通りにコードを書けば良い。

https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja

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)