見出し画像

Firebaseで管理したユーザーの一括削除

この記事は弊社のフルスタックエンジニア:Narayan Shresthaが作成した記事です。

モバイルおよびウェブアプリケーション開発プラットフォームとして人気の Firebase は、ユーザ管理を簡素化する Firebase Authentication を含む、堅牢なサービス群を提供しています。アプリケーションが成長するにつれ、効率的なユーザ管理が不可欠になります。一般的なタスクの1つは、アカウントのクリーンアップ、セキュリティ侵害、ユーザデータ保持ポリシーなど、様々な理由によるユーザの一括削除です。
この記事では、Go プログラミング言語 (Golang) を使って Firebase ユーザーを一括削除する方法を探ります。Firebase Admin SDK for Go を活用して Firebase Authentication と対話し、ユーザーを一括削除します。このガイドは、Firebase ユーザーを大規模に管理する必要がある開発者やシステム管理者向けに作成されています。

前提条件

ユーザーの一括削除に入る前に、以下の前提条件が整っていることを確認してください:

  1. Firebase アカウント: Firebaseプロジェクトの設定とFirebaseコンソールへのアクセスが必要です。

  2. Golangのインストール システムに Go (Golang) がインストールされている必要があります。Go は公式サイトからダウンロードしてインストールできます。

  3. Firebase Admin SDK: Firebase Admin SDK for Go をプロジェクトにインストールします。Firebase Admin SDK の公式ドキュメントにインストール方法が記載されています。

Go で Firebase Admin SDK を初期化する

Firebase Admin SDK を使用すると、さまざまな Firebase サービスとプログラムでやり取りできます。始めるには、Firebase Admin SDK をサービスアカウントの認証情報で初期化します。これらの認証情報は JSON ファイルに保存され、認証と認可に必要です。
以下は、Go で Firebase Admin SDK を初期化する方法です:

// Initialize Firebase Admin SDK
ctx := context.Background()
opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
    log.Fatalf("Error initializing Firebase Admin SDK: %v", err)
}
// Get the Auth client
client, err := app.Auth(ctx)if err != nil {
    log.Fatalf("Error getting Auth client: %v", err)
}

Firebase Admin SDK が初期化されたことで、ユーザ一括削除を効率的に実行する準備が整いました。

ユーザデータの取得

ユーザーを一括削除する前に、Firebase Authentication からユーザーのデータを取得する必要があります。Firebase Admin SDK は、ユーザーレコードを取得するための便利なメソッド client.Users を提供しています。オプションでページ分割用のページトークンを指定できますが、この例では簡単にするためにすべてのユーザーレコードを取得します。

// Retrieve a list of all user UIDs
iter := client.Users(context.Background(), "")
var userUIDs []string
for {
 user, err := iter.Next()
 if err != nil {
 if err == iterator.Done {
 break // All available users have been retrieved
 }
 log.Printf("Error retrieving user: %v", err)
 break
 }
 if user != nil {
 userUIDs = append(userUIDs, user.UID)
 }
}
// Now you have a list of user UIDs in the userUIDs slice.

ユーザーの一括削除

ユーザを一括で削除するには、その処理を行う関数を実装します。この例では、指定したサイズのバッチでユーザーを削除します。以下が一括削除のコードです:

func deleteUsersInBatch(client *auth.Client, userUIDsToDelete []string, batchSize int) {
    for i := 0; i < len(userUIDsToDelete); i += batchSize {
        end := i + batchSize
        if end > len(userUIDsToDelete) {
            end = len(userUIDsToDelete)
        }
        batch := userUIDsToDelete[i:end]
        _, err := client.DeleteUsers(context.Background(), batch)
        if err != nil {
            for _, uid := range batch {
                log.Printf("Error deleting user %s: %v", uid, err)
            }
        } else {
            for _, uid := range batch {
                log.Printf("Deleted user %s successfully", uid)
            }
        }
    }
}

最後に、最終的なコードを紹介しよう。
main.goという ファイル名を作り、以下の部分を貼り付ける:

package main

import (
   "context"
   "log"
  firebase "firebase.google.com/go/v4"
  "firebase.google.com/go/v4/auth"
  "google.golang.org/api/iterator"
  "google.golang.org/api/option"
)

func main() {
    // Initialize Firebase Admin SDK
    ctx := context.Background()

    opt := option.WithCredentialsFile("./serviceAccountKey.json")
    app, err := firebase.NewApp(ctx, nil, opt)
    if err != nil {
        log.Fatalf("Error initializing Firebase Admin SDK: %v", err)
    }

    // Get the Auth client
    client, err := app.Auth(ctx)
    if err != nil {
        log.Fatalf("Error getting Auth client: %v", err)
    }
    userUIDs := getAllUserUIDs(client, 2000)
   
    for _, uid := range userUIDs {
        log.Printf("User UID: %s", uid)
    }
    deleteUsersInBatch(client, userUIDs, 200)
 }

func deleteUsersInBatch(client *auth.Client, userUIDsToDelete []string, batchSize int) {
    for i := 0; i < len(userUIDsToDelete); i += batchSize {
        end := i + batchSize
        if end > len(userUIDsToDelete) {
            end = len(userUIDsToDelete)
        }
        batch := userUIDsToDelete[i:end]
        _, err := client.DeleteUsers(context.Background(), batch)
        if err != nil {
            for _, uid := range batch {
                log.Printf("Error deleting user %s: %v", uid, err)
            }
        } else {
            for _, uid := range batch {
                log.Printf("Deleted user %s successfully", uid)
            }
        }
    }
}

func removeUserByID(userUIDs []string, idToRemove string) []string {
    var filteredUIDs []string
    for _, uid := range userUIDs {
        if uid != idToRemove {
            filteredUIDs = append(filteredUIDs, uid)
        }
    }
    return filteredUIDs
}

func getAllUserUIDs(client *auth.Client, size int) []string {
    // Retrieve a list of all user UIDs
    iter := client.Users(context.Background(), "")
    var userUIDs []string
    for i := 0; i < size; i++ {
        user, err := iter.Next()
        if err != nil {
            if err == iterator.Done {
                break
            }
            log.Printf("Error retrieving user: %v", err)
            break
        }
    if user != nil {
        userUIDs = append(userUIDs, user.UID)
    }
    
    return userUIDs
}

では、「go run main.go」 を実行してください。

お役に立てれば幸いです。ハッピー・コーディング


協業開発及び開発パートナーをお探しのお客様へ

弊社は、ネパールに海外拠点を持ち、生成AI、モバイルアプリ、システム開発を中心に事業を展開する企業です。

自社サービスの開発経験を活かし、クライアント様と共に事業を創造することを重視し、創業以来、スタートアップから中小企業、大手企業、自治体まで、幅広い開発実績があります。プロダクトはユーザーが使いやすいように設計しており、企画から開発、保守運用まで対応しています。開発技術を厳選し限定することで、セキュリティ、プロダクトの品質向上に努めており、事業開発に関する課題を深く理解し、最適なご提案が可能です

お問い合わせはこちらから:
お問い合わせフォーム:https://readytowork.jp/ 

直通番号:080-8940-7169