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;
}
}
我已经用 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;
}
}