-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
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
Labels
No labels