Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete a Firebase user from Android App?

Tags:

I'm trying to code a Delete User method in my Android App, but I have some issues each time I execute it. This method will be executed when a user pushes the Delete account button on an Activity. My apps works with FirebaseUI Auth.

Here is the method:

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) When I execute that function a Smart Lock message appears on the screen and the user is signed in again. Here is a screenshot of this message.

Smartlock message

2) On other occasions, when the user is logged in for a long time, the function throws an Exception like this:

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've read that I have to re-authenticate the user but I'm not sure how to do this when I'm working with Google Sign In.

like image 406
Armando Avatar asked Jun 30 '16 05:06

Armando


People also ask

How do I remove a user from Firebase?

You can also delete users from the Authentication section of the Firebase console, on the Users page. Important: To delete a user, the user must have signed in recently. See Re-authenticate a user.

Where are firebase users stored?

Firebase users have a fixed set of basic properties—a unique ID, a primary email address, a name and a photo URL—stored in the project's user database, that can be updated by the user (iOS, Android, web).


2 Answers

As per the Firebase documentation can user delete() method to remove user from the Firebase

Before remove the user please reAuthenticate the user.

Sample code

     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("[email protected]", "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.");                     }                 }             });     } }); 

For more details : https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user

If you want to user re Authentication with other singin provider only need to change the Provider for GoogleAuthProvider below is the sample code

GoogleAuthProvider.getCredential(googleIdToken,null); 
like image 123
Maheshwar Ligade Avatar answered Sep 20 '22 00:09

Maheshwar Ligade


The answer provided by Ansuita Jr. is very beautifully explained and is correct with just a small problem. The user gets deleted even without having successful re-authentication. This is because we use

user.delete()

in the onComplete() method which is always executed. Therefore, we need to add an if check to check whether the task is successful or not which is mentioned below

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();                  }               }          }); 
like image 33
Damanpreet Singh Avatar answered Sep 23 '22 00:09

Damanpreet Singh