web-dev-qa-db-fra.com

Déconnectez correctement un utilisateur de l'application Android

Je développe une petite application Android et, pour l’instant, elle ne comporte que des fonctionnalités de connexion et de déconnexion. J'utilise Firebase pour stocker les données utilisateur et également pour l'authentification. 

J'ai donc la connexion qui fonctionne et authentifie les utilisateurs comme il se doit et j'ai la déconnexion de travailler dans le sens où elle est unauthenticates utilisateurs. Mais y a-t-il quelque chose que je dois faire depuis l'application pour tuer la session? 

if (id == R.id.action_log_out) {
    ref.unauth(); //End user session
    startActivity(new Intent(MainActivity.this, LoginActivity.class)); //Go back to home page
    finish();
}        

Cela fonctionnera-t-il comme je le pense? Évidemment, si quelqu'un se déconnecte, il ne devrait pas être en mesure d'appuyer sur le bouton Précédent et de revenir par magie à la dernière page sans se reconnecter. 

18
John

Lorsque Firebase authentifie l'utilisateur (ou vous authentifiez l'utilisateur avec Firebase), il stocke le jeton de cet utilisateur dans un stockage local sur votre périphérique. Cela se produit lorsque vous appelez l’une des méthodes authWith... (bien sûr, uniquement si l’utilisateur est authentifié avec succès).

L'appel de ref.unauth(); supprime immédiatement ce jeton de la mémoire de stockage locale.

Un flux correctement implémenté ne les ré-authentifierait pas automatiquement lorsque l'utilisateur appuierait sur le bouton Précédent, mais cela dépend du flux que vous implémentez (ce qui manque à votre question et serait probablement trop de code de toute façon).

12
Frank van Puffelen

À partir de la documentation Firebase

https://firebase.google.com/docs/auth/Android/custom-auth

appelez cette FirebaseAuth.getInstance().signOut();

17

Je vois 2 options pour le problème que nous avons avec le bouton Précédent après la déconnexion:

Dans votre LoginActivity, qui devrait être votre activité de lanceur, remplacez la méthode onBackPressed et laissez-la vide:

    @Override
public void onBackPressed() {
// empty so nothing happens
}

Ou/et vous pouvez ajouter le LoginActivityIntent dans votre LogoutActivty si utilisateur == null. Ainsi, chaque fois qu'un utilisateur non authentifié atterrira sur l'activité, il se redirigera instantanément vers LoginActivity, bien que cela ait l'air bizarre.

        mAuth = FirebaseAuth.getInstance();
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                Log.d(TAG,"onAuthStateChanged:signed_out");
                startActivity(new Intent(LogoutActivity.this, LoginActivity.class));
            }
            // ...
        }
    };

La première option est plus facile, mais je suppose que si vous appliquez tous les deux votre côté sauvegarde ^^ Je code depuis 2 semaines, alors corrigez-moi si je me trompe.

4
Daniel Szy

Vous pouvez remplacer finish() par finishAffinity(); 

1

Supprimer les jetons et les ID d'instance

String authorizedEntity = PROJECT_ID;  
String scope = "GCM";
FirebaseInstanceID.getInstance(context).deleteToken(authorizedEntity,scope);

Vous pouvez également supprimer l'ID d'instance lui-même, y compris tous les jetons associés. La prochaine fois que vous appelez getInstance (), vous obtiendrez un nouvel ID d'instance:

FirebaseInstanceID.getInstance(context).deleteInstanceID();
String newIID = InstanceID.getInstance(context).getId();
0
Ebin Joy