You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Firebase Auth多角色用户:删除用户方法报错解决

Flutter Firebase Auth 删除用户报错:The method 'deleteUser' isn't defined for the type 'FirebaseAuth'

我开发了一款管理员App,通过Firebase Auth管理多角色用户,实现增删改查操作。但调用deleteUser(userId)删除用户时,出现错误提示:The method 'deleteUser' isn't defined for the type 'FirebaseAuth',相关代码如下:

void addCounter({
    required String name,
    required String email,
    required String password,
  }) async {
    print('on add counter');
    try {
      await auth
          .createUserWithEmailAndPassword(email: email, password: password)
          .then((value) => {
                FirebaseFirestore.instance
                    .collection("SuperUsers")
                    .doc(value.user!.uid)
                    .set({
                  'role': "counter",
                  'uid': value.user!.uid,
                  'name': name,
                })
              });
    } on FirebaseAuthException catch (e) {
      print(e.message);
      Get.snackbar(
        "Error",
        e.message!,
        snackPosition: SnackPosition.BOTTOM,
      );
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> deleteCounter(String userId) async {
    try {
      // Step 1: Remove user from Firebase Authentication
      await FirebaseAuth.instance.deleteUser(userId);
      // Step 2: Remove user data from Firestore
      await FirebaseFirestore.instance
          .collection('SuperUsers')
          .doc(userId)
          .delete();
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> updateUser(
      {required String userId, required String name}) async {
    try {
      await FirebaseFirestore.instance
          .collection('SuperUsers')
          .doc(userId)
          .update({
        'name': name,
      });
    } catch (e) {
      print(e.toString());
    }
  }

  static Stream<List<CounterModel>> counterStream() {
    return firebaseFirestore
        .collection('SuperUsers')
        .snapshots()
        .map((QuerySnapshot query) {
      List<CounterModel> counters = [];
      for (var counter in query.docs) {
        final counterItem =
            CounterModel.fromDocumentSnapshot(snapshot: counter);

        counters.add(counterItem);
      }
      return counters;
    });
  }

错误原因

Flutter的Firebase Auth客户端SDK中,FirebaseAuth类并没有deleteUser(userId)方法——该方法属于Firebase Admin SDK(仅用于服务器端)。客户端SDK仅允许当前登录的用户删除自己的账号,如果要实现管理员删除其他用户的功能,必须通过云函数或后端服务调用Admin SDK完成。

解决方法

情况1:删除当前登录的用户

如果是删除管理员自身账号,直接获取当前用户实例调用delete()方法即可:

Future<void> deleteCurrentUser() async {
  try {
    User? currentUser = FirebaseAuth.instance.currentUser;
    if (currentUser != null) {
      await currentUser.delete();
      // 同步删除Firestore中的用户数据
      await FirebaseFirestore.instance.collection('SuperUsers').doc(currentUser.uid).delete();
    }
  } catch (e) {
    print(e.toString());
  }
}

情况2:管理员删除其他用户(推荐方案)

由于客户端无法直接删除其他用户,需借助Firebase Cloud Functions实现:

  1. 创建云函数(Node.js示例):
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.deleteUser = functions.https.onCall(async (data, context) => {
  // 验证调用者是否为管理员(根据你的角色逻辑调整)
  const callerUid = context.auth?.uid;
  if (!callerUid) {
    throw new functions.https.HttpsError("unauthenticated", "用户未登录");
  }
  
  const callerDoc = await admin.firestore().collection("SuperUsers").doc(callerUid).get();
  if (!callerDoc.exists || callerDoc.data()?.role !== "admin") {
    throw new functions.https.HttpsError("permission-denied", "无管理员权限");
  }

  const userId = data.userId;
  try {
    // 删除Auth中的用户
    await admin.auth().deleteUser(userId);
    // 删除Firestore中的用户数据
    await admin.firestore().collection("SuperUsers").doc(userId).delete();
    return { success: true };
  } catch (error) {
    throw new functions.https.HttpsError("internal", "删除用户失败", error.message);
  }
});
  1. Flutter客户端调用云函数:
import 'package:cloud_functions/cloud_functions.dart';

Future<void> deleteCounter(String userId) async {
  try {
    final HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('deleteUser');
    await callable.call({"userId": userId});
    print("用户删除成功");
  } on FirebaseFunctionsException catch (e) {
    print("删除失败: ${e.message}");
    Get.snackbar(
      "错误",
      e.message ?? "删除用户失败",
      snackPosition: SnackPosition.BOTTOM,
    );
  } catch (e) {
    print(e.toString());
  }
}

补充说明

  • 客户端SDK限制删除其他用户是出于安全考虑,避免恶意操作;
  • 务必在云函数中添加权限验证逻辑,确保只有管理员能执行删除操作。

内容的提问来源于stack exchange,提问作者Opsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:47:27