Skip to content

ユーザーの削除のハンドリング対応 #111

@minti05

Description

@minti05

high

deleteAccountメソッド内のFirestoreの更新とFirebase Authのユーザー削除は、アトミックな操作ではありません。updateRegisteredStatusが成功した後にdeleteUserが失敗した場合、Firestore上のregisteredフラグだけがfalseになり、Authユーザーは残ってしまうという不整合な状態が発生します。
作者様のコメント// 本来はTransactionなどでやるべきだが簡易的ににある通り、このような複数の書き込み処理はアトミックに実行することが望ましいです。

Authの操作はバッチに含められないため、Cloud FunctionsでAuthのonDeleteトリガーを使うのが最も堅牢ですが、クライアントサイドで改善するならば、先にdeleteUserを実行し、成功した場合のみupdateRegisteredStatusを実行する順序にすることで、より安全になります。

  Future<void> deleteAccount() async {
    final user = ref.read(authRepositoryProvider).currentUser;
    if (user != null && user.email != null) {
      final email = user.email!;
      try {
        // 先にAuthユーザーを削除します。こちらが失敗すると影響が大きいため。
        await ref.read(authRepositoryProvider).deleteUser();
        // Authユーザーの削除が成功した場合のみ、Firestoreのステータスを更新します。
        await ref.read(userRepositoryProvider).updateRegisteredStatus(email: email, isRegistered: false);
      } catch (e) {
        // ここでエラーをログに記録したり、ユーザーにフィードバックを返すことができます。
        rethrow;
      }
    }
  }

Originally posted by @gemini-code-assist[bot] in #109 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions