Firebase 删除使用苹果正确签名的用户

Firebase Delete User who signed it with apple correclty

我已经用 Firebase 实现了 Sign-In-With-Apple。而且我还有删除用户的功能。这就是我所做的:

  static Future<bool> deleteUser(BuildContext context) async {
    try {
      await BackendService().deleteUser(
        context,
      );

      await currentUser!.delete(); // <-- this actually deleting the user from Auth

      Provider.of<DataProvider>(context, listen: false).reset();

      return true;
    } on FirebaseException catch (error) {
      print(error.message);
      AlertService.showSnackBar(
        title: 'Fehler',
        description: error.message ?? 'Unbekannter Fehler',
        isSuccess: false,
      );
      return false;
    }
  }

如您所见,我从 auth 中删除了所有用户数据,最后删除了用户本人。

但Apple 仍然认为我在使用该应用程序。我可以在我的设置中看到它:

另外,当我再次尝试使用 apple 登录时,它就像我已经有一个帐户一样。但是我刚刚删除了它并且 Firebase 中没有任何内容表明我仍然拥有该帐户? 如何从 Firebase 中完全删除 Apple 用户?我在这里错过了什么?

您确实从 Firebase 中删除了用户,但 Apple 并不知道。您也应该从 Apple 删除该信息。打开 iPhone 上的“设置”应用,然后点击顶部的您的名字。然后按“密码和安全”,然后按“Apple ID 登录”。所有 Apple ID 登录都应该列在那里并且可以删除。

Apple 和其他一些第 3 方身份提供商通常不提供 API 来执行此操作。

访问这些数据可能会导致隐私问题,例如,恶意应用程序可以在访问用户个人资料后删除授权信息。

但是如果你想做一个“优雅”的注销,你可以要求你的用户从 iOS 设置注销,然后听 server-to-server notification 撤销。

所以...Apple 不提供此服务。但我找到了解决方法。

我的登录过程:

1.检查用户之前是否登录

  // Create an `OAuthCredential` from the credential returned by Apple.
  final oauthCredential = OAuthProvider("apple.com").credential(
    idToken: appleCredential.identityToken,
    rawNonce: rawNonce,
  );

  // If you can not access the email property in credential,
  // means that user already signed in with his appleId in the application once before
  bool isAlreadyRegistered = appleCredential.email == null;

现在进入关键部分:

2。登录用户并检查 uid 是否已存在于 Firebase

  final UserCredential result =
      await FirebaseAuth.instance.signInWithCredential(
    oauthCredential,
  );

  isAlreadyRegistered = await BackendService.checkIfUserIdExists(
    result.user?.uid ?? '',
  );

checkIfUserIdExists也很简单:

  static Future<bool> checkIfUserIdExists(String userId) async {
    try {
      var collectionRef = FirebaseFirestore.instance.collection(
        BackendKeys.users,
      );

      var doc = await collectionRef.doc(userId).get();
      return doc.exists;
    } on FirebaseException catch (e) {
      return false;
    }
  }