【Go】ローカル環境でサービスアカウントキー以外の認証方法でFirebase Admin SDKを使用する

公式ドキュメント でサービスアカウントキーを使った方法が書いてあり、他に方法がないかなと思って gcloud auth application-default login
を試した。
しかしどうやらFirebase Admin SDKを使うには、ユーザーの認証ではなくサービスアカウントの認証が必要らしくハマっていたためメモしておく。

事前準備1: アプリケーションで使用するサービスアカウントを準備する
ここでのサービスアカウントを application@example.gserviceaccount.com
とする。
Firebase Admin SDK 管理者サービスエージェント
の権限をつける。

事前準備2: 自分のGoogleアカウントに上記アカウントの借用権限をつける
自分のGoogleアカウントに、 application@example.gserviceaccount.com
の借用権限をつける。
これにより、ローカルで application@example.gserviceaccount.com
になりすましてアプリケーションを実行できる。
具体的な設定方法としては、application@example.gserviceaccount.com
のサービスアカウントに対して、以下の権限設定を行う。
- プリンシパル: 自分のGoogleアカウントのメールアドレス
- 権限: サービスアカウントトークン作成者

アプリケーション実行時の認証
gcloud auth application-default login --impersonate-service-account <service-account-email>
でサービスアカウントの権限借用を使用して認証する。
上記の例だと、 <service-account-email>
の箇所に application@example.gserviceaccount.com
を入力すればOK。

Firebase Admin SDKの初期化
package firebaseauth
import (
"context"
firebase "firebase.google.com/go"
"firebase.google.com/go/auth"
)
func NewClient(ctx context.Context, projectID string) (*auth.Client, error) {
app, err := firebase.NewApp(ctx, &firebase.Config{
ProjectID: projectID, // プロジェクトIDを指定する(重要)
})
if err != nil {
return nil, err
}
authCli, err := app.Auth(ctx)
if err != nil {
return nil, err
}
return authCli, nil
}

実行する
上記のauth.Clientを使用してFirebaseのユーザー作成を行うスクリプトを実行すると、サービスアカウントキーを使用せずにユーザーの作成に成功した。
const (
email = "dummy_email@example.com"
)
func main() {
projectID := os.Getenv("FIREBASE_PROJECT_ID") // 設定しておく
ctx := context.Background()
authCli, err := firebaseauth.NewClient(ctx, projectID)
if err != nil {
log.Fatal(err)
}
params := (&auth.UserToCreate{}).
Email(email).
EmailVerified(false).
Disabled(false)
user, err := authCli.CreateUser(ctx, params)
if err != nil {
log.Fatal(err)
}
fmt.Println("Successfully created user:", user.UID)
}