当我想删除应用程序中的 Firebase 用户帐户时,如果用户最近登录过,则操作会正常通过,但在一段时间后,如果我尝试删除用户,则会收到此错误 “此操作很敏感,需要最近的身份验证。在重试此请求之前请重新登录。” 通常情况下,firebase会自动刷新用户会话,但我没有找到为什么他希望用户再次登录,甚至Auth.auth().currentUser的值不是nil。感谢您的帮助 ! 这是我删除用户帐户的代码:
@objc func deleteAccountAction(){
self.showProgressView()
let user = Auth.auth().currentUser
let id=Auth.auth().currentUser?.uid
self.refProducts.child(id!).removeValue { error, _ in
if(error != nil){
print("firebase remove error")
print(error?.localizedDescription.description ?? nil)
self.dismissHUD(isAnimated: true)
}
else{
self.refUsers.child(id!).removeValue { error, _ in
if(error != nil){
print("firebase remove error")
print("error while deleting user from firebase: "+error!.localizedDescription)
self.dismissHUD(isAnimated: true)
}
else {
user?.delete { error in
if error != nil {
print("error while deleting user:" + error!.localizedDescription)
self.dismissHUD(isAnimated: true)
} else {
UserDefaults.standard.removeObject(forKey: "USER_UID")
UserDefaults.standard.synchronize
self.dismissHUD(isAnimated: true)
let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "StartingViewController") as! StartingViewController
nextVC.isAccoundDeleted=true
GlobalVar.user=nil
self.navigationController?.pushViewController(nextVC, animated: true)
}
}
}
}
}
}
}
对于某些敏感操作(例如更改用户密码或删除用户帐户),Firebase 要求用户最近已登录。如果在尝试执行此类操作时用户最近未登录,Firebase 会抛出异常你得到的异常。
当您收到此异常时,您应该要求用户重新输入其凭据,然后重试该操作。
来自有关处理错误的文档:
[删除用户帐户]是一项安全敏感操作,需要用户最近登录。此错误表明用户最近没有登录。要解决此问题,请通过在
上调用reauthenticateWithCredential:completion:
重新验证用户身份。FIRUser
除了Frank van的回答之外,时间跨度是5分钟。登录5分钟后无法进行此类操作。
您可以参考FIRAuthErrorCode(查看错误代码17014:FIRAuthErrorCodeRequiresRecentLogin = 17014)
这里有一个解决方法: 调用执行用户帐户删除的云函数并注销客户端。您必须确保此云功能得到适当的保护,以免被恶意使用。
对您的用户表现出礼貌。向他们提供一个适当的对话框,表明这是不可逆转的,所有相关的用户数据将被永久删除。仅当用户接受后果时才调用该函数。
PSA编辑: 尽管这种方法可行,但它会给您的用户配置文件和数据带来不适当的风险。删除帐户过程要求用户重新登录的要求服务于更高的目标,即为用户帐户提供额外的保护层。通过按照解决方案建议绕过它,您将面临这样的风险:使用该设备的其他参与者将能够在不进行任何额外检查的情况下删除该帐户。这是一个不可逆转的过程,所以如果错误地完成了,那么就没有办法回去了。
要处理此问题,您可以使用
showReauthenticateDialog()
包中的 Firebase UI Auth 的 firebase_ui_auth
函数。这提供了一个预构建的、可自定义的 UI,用于重新身份验证,可与各种登录方法配合使用。重新认证完成后,您应该可以调用账户删除功能了。
我找不到好的文档,但您可以在此处查看该功能。
这是我的实现:
initiateAccountDeletion() async {
User? user = _auth.currentUser;
try {
await user.delete();
} on FirebaseAuthException catch (e, stackTrace) {
if (e.code == 'requires-recent-login') {
// Show re-authentication dialog
await firebase_us_auth.showReauthenticateDialog(
context: Get.context!,
providers: [
firebase_us_auth.EmailAuthProvider(),
GoogleProvider(clientId: Firebase.app().options.iosClientId!),
AppleProvider(),
],
auth: _auth,
);
// After successful re-authentication, try deleting the account again
await user.delete();
} else {
Get.snackbar(
'Error',
'Failed to delete account: ${e.message}',
);
logger.e('Failed to delete account', e, stackTrace);
}
} catch (e, stackTrace) {
Get.snackbar(
'Error',
'An unexpected error occurred. Please try again or contact support.',
);
logger.e('Failed to delete account', e, stackTrace);
}
}
您可以做的(这可能是最简单的方法)是在用户首次登录时(例如使用 AsyncStorage)将用户的登录名和密码保存在本地存储中,一旦他们想要删除帐户,请再次登录无需他们在您删除帐户之前重新输入凭据。他们甚至不会注意到您在删除帐户之前再次登录。
我不是安全专家,但密码和电子邮件将存储在本地,无法访问外界,因此我不认为那里存在任何安全问题。
一旦删除应用程序,本地存储就会消失,至少对于 AsyncStorage 来说是这样。 一旦您注销用户并使用另一个帐户,新帐户凭据将覆盖本地存储中的旧帐户凭据。