J'essaie de coder une méthode Delete User dans mon application Android, mais j'ai des problèmes à chaque fois que je l'exécute. Cette méthode sera exécutée lorsqu'un utilisateur appuiera sur le bouton Supprimer le compte d'une activité. Mes applications fonctionnent avec FirebaseUI Auth.
Voici la méthode:
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) Lorsque j'exécute cette fonction, un message Smart Lock apparaît à l'écran et l'utilisateur est reconnecté. Voici une capture d'écran de ce message.
2) Dans d'autres cas, lorsque l'utilisateur est connecté depuis longtemps, la fonction lève une exception comme celle-ci:
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)
J'ai lu que je dois ré-authentifier l'utilisateur, mais je ne sais pas comment procéder lorsque je travaille avec Google Sign In.
Selon la documentation Firebase
, la méthode delete()
de l'utilisateur peut supprimer l'utilisateur du fichier Firebase.
Avant de supprimer l'utilisateur, veuillez reAuthenticate l'utilisateur.
Exemple de 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.");
}
}
});
}
});
Pour plus de détails: https://firebase.google.com/docs/auth/Android/manage-users#re-authenticate_a_user
Si vous souhaitez utiliser l’authentification avec un autre fournisseur de singin, vous devez uniquement modifier la variable Provider
pour GoogleAuthProvider
ci-dessous.
GoogleAuthProvider.getCredential(googleIdToken,null);
Tout d'abord, vous devez stocker le jeton d'authentification ou le mot de passe au moment où votre utilisateur se connecte. Si votre application ne fournit pas de connexion telle que Google Sign-in, Facebook Sign-in ou autre, vous devez simplement stocker le fichier. mot de passe.
//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();
}
}
});
}
});
}
La réponse fournie par Ansuita Jr. est très bien expliquée et est correcte avec juste un petit problème . L'utilisateur est supprimé même sans avoir réussi à se réauthentifier. C'est parce que nous utilisons
user.delete ()
dans la méthode onComplete () qui est toujours exécutée . Par conséquent, nous devons ajouter un if pour vérifier si la tâche aboutit ou non, comme indiqué ci-dessous.
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();
}
}
});
Votre callback delete
traite déjà le cas d'un échec, pourquoi ajoutez-vous addOnFailureListener
plus tard?
Essayez de le supprimer, de cette façon:
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!");
}
}
});
}
Utilisez ces méthodes: -
retirer()
équivaut à appeler set(null)
.
ou
removeUser ()
removeUser(credentials, [onComplete])
@ Développeurs Android:
J'ai rencontré un problème où les informations de Firebase Auth persistaient sur le disque de l'appareil APRÈS la désinstallation de l'application. Après des expériences et des lectures à ce sujet, j'ai constaté que la définition de Android:allowBackup="false"
et Android:fullBackupContent="false"
dans la balise <application>
du manifeste garantissait que les informations d'identité n'étaient pas conservées après la désinstallation de l'application.
Veuillez noter que ce type de persistance ne se produisait pas sur tous les appareils Android. En fait, cela a commencé à se produire sur l'un de mes appareils n'ayant jamais eu ce problème.