概要
FirebaseAuthを検証で使ってたら example1@example.org
みたいなユーザーが大量に増えてしまったので一括で削除を行いたいが、Firebaseのコンソールからは出来ないみたいだったので Firebase Admin SDK で一括削除を行うことにした。該当記事が見つけられなかったので自分用メモも兼ねて記事を書いた。
今回は Go 言語で削除処理を書いたが、下記の言語も対応している模様。
- Node.js
- Java
- Python
- C#
参考: サーバーに Firebase Admin SDK を追加する
前準備
-
go get firebase.google.com/go
で Firebase Admin SDK を導入 - Firebaseコンソールからサービスアカウントキーを取得する
サービス アカウント用の秘密鍵ファイルを生成するには:
1. Firebase コンソールで、[設定] > [サービス アカウント] を開きます。
2. [新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。
3. キーを含む JSON ファイルを安全に保管します。
※ https://firebase.google.com/docs/admin/setup より引用
実装
全ユーザーを一括削除するAPIは存在しなかったので、全ユーザーを取得してイテレータで1つずつ削除処理を行った。
参考: ユーザー管理 | Firebase
package main
import (
"context"
"firebase.google.com/go"
"firebase.google.com/go/auth"
"google.golang.org/api/iterator"
"google.golang.org/api/option"
"log"
)
func main() {
// Firebaseと接続する
opt := option.WithCredentialsFile("./サービスアカウントキー.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
log.Fatalf("error connect firebase: %s\n", err)
}
// FirebaseAuthクライアントを取得
client, err := app.Auth(context.Background())
if err != nil {
log.Fatalf("error connect firebase auth: %s\n", err)
}
// 全てのユーザーを取得する
iter := client.Users(context.Background(), "")
for {
user, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("error listing users: %s\n", err)
}
log.Printf("read user email: %v\n", user.Email)
// ユーザーを削除する
err = deleteUser(client, user.UID)
if err != nil {
log.Fatalf("error deleting user: %s\n", err)
}
}
}
// ユーザーを削除する
func deleteUser(client *auth.Client, uid string) error {
err := client.DeleteUser(context.Background(), uid)
if err != nil {
return err
}
log.Printf("Successfully deleted user: %s\n", uid)
return nil
}
まとめ
Authユーザーの一括削除は開発者にとって需要が高いと思うので、この記事が誰かの力になれたらと思います。
セキュリティ的にマズい、コードの書き方に問題がある等がありましたらコメントでご教示頂けますと幸いです。