【问题标题】:How to delete a Firebase user from Android App?如何从 Android 应用程序中删除 Firebase 用户?
【发布时间】: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})

标签: android firebase-realtime-database firebase-authentication firebaseui


【解决方案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提供者重新认证用户只需要更改ProviderGoogleAuthProvider下面是示例代码

GoogleAuthProvider.getCredential(googleIdToken,null);

【讨论】:

  • 当然可以,但我不知道如何对 GoogleSignInProvider 做同样的事情。
  • 您必须遵循相同的步骤 AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken,null);其他步骤都一样
  • 但是,我怎么知道用户的密码。有什么方法吗?
  • 这将从 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的&lt;application&gt;标签中设置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】:

              如果您使用的是 AuthUIFirebaseAuth,您可以执行以下操作

               AuthUI.getInstance().delete(context).addOnSuccessListener {
                         
               }.addOnFailureListener{
              
               }
              

              FirebaseAuth.getInstance().currentUser.delete().addOnSuccessListener...
              

              【讨论】:

                猜你喜欢
                • 2018-05-04
                • 2020-06-16
                • 1970-01-01
                • 2016-11-02
                • 1970-01-01
                • 1970-01-01
                • 2020-01-19
                • 2019-10-16
                • 2017-04-30
                相关资源
                最近更新 更多