如何从Android App中删除Firebase用户?

Arm*_*ndo 18 android firebase-authentication firebase-realtime-database firebaseui

我正在尝试在我的Android应用程序中编写删除用户方法,但每次执行它时都会遇到一些问题.当用户按下活动上的删除帐户按钮时,将执行此方法.我的应用与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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

1)当我执行该功能时,屏幕上会出现一个Smart Lock消息,用户再次登录.以下是此消息的屏幕截图.

Smartlock消息

2)在其他情况下,当用户登录很长时间时,该函数抛出一个Exception,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

我已经读过,我必须重新验证用户身份,但是当我使用Google登录时,我不确定如何执行此操作.

Mah*_*ade 21

根据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.");
                    }
                }
            });

   }
});
Run Code Online (Sandbox Code Playgroud)

有关详情,请访问:https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user

如果你想与其他嬉提供商用户重新认证只需要更改ProviderGoogleAuthProvider下面的示例代码

GoogleAuthProvider.getCredential(googleIdToken,null);
Run Code Online (Sandbox Code Playgroud)

  • 您必须执行相同的步骤 AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken,null); 所有其他步骤都相同 (2认同)

Dam*_*ngh 5

Ansuita Jr. 提供的答案解释得非常漂亮,只是一个小问题是正确的。 即使没有成功重新认证,用户也会被删除。 这是因为我们使用

用户删除()

在始终执行的 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();
                 }
              }
         });
Run Code Online (Sandbox Code Playgroud)