Closed6

【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)
}
このスクラップは2024/11/30にクローズされました