如何从 Android 应用程序中删除 Firebase 用户?
Posted
技术标签:
【中文标题】如何从 Android 应用程序中删除 Firebase 用户?【英文标题】:How to delete a Firebase user from Android App? 【发布时间】:2016-11-02 01:15:22 【问题描述】:我正在尝试在我的 android 应用程序中编写 Delete User 方法,但每次执行时都会遇到一些问题。当用户按下 Activity 上的 删除帐户 按钮时,将执行此方法。我的应用使用 FirebaseUI Auth。
方法如下:
private void deleteAccount()
Log.d(TAG, "ingreso a deleteAccount");
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
final FirebaseUser currentUser = firebaseAuth.getCurrentUser();
currentUser.delete().addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
Log.d(TAG,"OK! Works fine!");
startActivity(new Intent(Main3WelcomeActivity.this, Main3Activity.class));
finish();
).addOnFailureListener(new OnFailureListener()
@Override
public void onFailure(@NonNull Exception e)
Log.e(TAG,"Ocurrio un error durante la eliminación del usuario", e);
);
1) 当我执行该功能时,屏幕上会出现一条 Smart Lock 消息,并且用户再次登录。这是此消息的屏幕截图。
2)其他情况下,当用户长时间登录时,函数会抛出这样的异常:
06-30 00:01:26.672 11152-11152/com.devpicon.android.firebasesamples E/Main3WelcomeActivity: Ocurrio un error durante la eliminación del usuario
com.google.firebase.FirebaseException: An internal error has occured. [ CREDENTIAL_TOO_OLD_LOGIN_AGAIN ]
at com.google.android.gms.internal.zzacq.zzbN(Unknown Source)
at com.google.android.gms.internal.zzacn$zzg.zza(Unknown Source)
at com.google.android.gms.internal.zzacy.zzbO(Unknown Source)
at com.google.android.gms.internal.zzacy$zza.onFailure(Unknown Source)
at com.google.android.gms.internal.zzact$zza.onTransact(Unknown Source)
at android.os.Binder.execTransact(Binder.java:453)
我已经读到I have to re-authenticate 用户,但我不确定在使用 Google 登录时如何执行此操作。
【问题讨论】:
对它使用 removeUser(credentials) 【参考方案1】:根据Firebase
文档,可以使用delete()
方法从Firebase
在删除用户之前,请重新验证用户。
示例代码
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// Get auth credentials from the user for re-authentication. The example below shows
// email and password credentials but there are multiple possible providers,
// such as GoogleAuthProvider or FacebookAuthProvider.
AuthCredential credential = EmailAuthProvider
.getCredential("user@example.com", "password1234");
// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
.addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
user.delete()
.addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
Log.d(TAG, "User account deleted.");
);
);
更多详情:https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user
如果你想用其他singin提供者重新认证用户只需要更改Provider
为GoogleAuthProvider
下面是示例代码
GoogleAuthProvider.getCredential(googleIdToken,null);
【讨论】:
当然可以,但我不知道如何对 GoogleSignInProvider 做同样的事情。 您必须遵循相同的步骤 AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken,null);其他步骤都一样 但是,我怎么知道用户的密码。有什么方法吗? firebase.google.com/docs/auth/web/manage-users这个链接可能有用 这将从 firebase 数据库中删除用户,如果 firebase 中的 Facebook 用户身份验证数据可能会被删除,但如果我们考虑一般行为,这可能会被删除【参考方案2】:Ansuita Jr. 提供的答案解释得非常漂亮,而且只有一个小问题是正确的。 即使重新认证成功,用户也会被删除。 这是因为我们使用
user.delete()
在始终执行的 onComplete() 方法中。 因此,我们需要添加一个if检查来检查任务是否成功,如下所述
user.reauthenticate(credential)
.addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
Log.e("TAG", "onComplete: authentication complete");
user.delete()
.addOnCompleteListener (new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
Log.e("TAG", "User account deleted.");
else
Log.e("TAG", "User account deletion unsucessful.");
);
else
Toast.makeText(UserProfileActivity.this, "Authentication failed",
Toast.LENGTH_SHORT).show();
);
【讨论】:
【参考方案3】:你的delete
回调已经处理了失败的情况,你为什么还要添加addOnFailureListener
?
尝试删除它,这样:
private void deleteAccount()
Log.d(TAG, "ingreso a deleteAccount");
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
final FirebaseUser currentUser = firebaseAuth.getCurrentUser();
currentUser.delete().addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
Log.d(TAG,"OK! Works fine!");
startActivity(new Intent(Main3WelcomeActivity.this, Main3Activity.class));
finish();
else
Log.w(TAG,"Something is wrong!");
);
【讨论】:
【参考方案4】:首先,您需要存储用户登录时的身份验证令牌或密码。如果您的应用不提供 Google Sign-in、Facebook Sign-in 等,您只需要存储密码。
//If there's any, delete all stored content from this user on Real Time Database.
yourDatabaseReferenceNode.removeValue();
//Getting the user instance.
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null)
//You need to get here the token you saved at logging-in time.
String token = "userSavedToken";
//You need to get here the password you saved at logging-in time.
String password = "userSavedPassword";
AuthCredential credential;
//This means you didn't have the token because user used like Facebook Sign-in method.
if (token == null)
credential = EmailAuthProvider.getCredential(user.getEmail(), password);
else
//Doesn't matter if it was Facebook Sign-in or others. It will always work using GoogleAuthProvider for whatever the provider.
credential = GoogleAuthProvider.getCredential(token, null);
//We have to reauthenticate user because we don't know how long
//it was the sign-in. Calling reauthenticate, will update the
//user login and prevent FirebaseException (CREDENTIAL_TOO_OLD_LOGIN_AGAIN) on user.delete()
user.reauthenticate(credential)
.addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
//Calling delete to remove the user and wait for a result.
user.delete().addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
//Ok, user remove
else
//Handle the exception
task.getException();
);
);
【讨论】:
先生,我想删除现在认证的人。我的意思是用户登录了我的应用程序并决定删除他/她的帐户。我该怎么做? 多提供商身份验证的出色答案和评论说明。【参考方案5】:@Android 开发者:
我遇到了一个问题,即卸载应用后 Firebase 身份验证信息一直保留在设备磁盘中。经过实验和阅读,我发现在Manifest的<application>
标签中设置android:allowBackup="false"
和android:fullBackupContent="false"
可以保证应用卸载后身份信息不被持久化。
请注意,这种持久性并非在所有 Android 设备上都发生。事实上,它开始在我从未出现过此问题的设备之一上发生。
【讨论】:
【参考方案6】:如果登录方式为“匿名”,则直接调用即可
FirebaseAuth.getInstance().getCurrentUser().delete().addOnCompleteListener(task ->
if (task.isSuccessful())
Log.d(TAG, "Deletion Success");
);
但如果是不同的方法,您将需要重新验证。 How to re-authenticate
【讨论】:
【参考方案7】:使用这个方法:-
移除()
相当于调用set(null)
。
或
removeUser()
removeUser(credentials, [onComplete])
【讨论】:
【参考方案8】:仅获取当前用户并使用以下方法将其删除即可正常工作
user.delete();
你也可以添加 Oncompletelistner
通过 addinduser.delete().addOnCompleteListner(new OnCompleteListner)
and 更多内容
【讨论】:
【参考方案9】:如果您使用的是 AuthUI 或 FirebaseAuth,您可以执行以下操作
AuthUI.getInstance().delete(context).addOnSuccessListener
.addOnFailureListener
或
FirebaseAuth.getInstance().currentUser.delete().addOnSuccessListener...
【讨论】:
以上是关于如何从 Android 应用程序中删除 Firebase 用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Android 应用程序中删除 Firebase 用户?
如何从 Android 开发者控制台上的应用程序列表中删除应用程序
如何使用 adb shell 从 Android 设备中删除内置应用程序