web-dev-qa-db-fra.com

Firebase: Comment garder un utilisateur Android connecté?

J'utilise Firebase SimpleLogin pour activer l'authentification par courrier électronique/mot de passe. La création d'utilisateurs et la connexion ultérieure fonctionnent correctement. Cependant, chaque fois que je quitte l'application (même si ce n'est que pendant quelques secondes), l'utilisateur n'est jamais connecté à mon retour, c'est-à-dire ...

authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler())...

Retourne toujours un utilisateur nul.

Je ne déconnecte pas l'utilisateur via l'API. J'ai également défini le nombre de jours d'ouverture de session de l'utilisateur sur 21 dans la console Firebase.

J'ai vu la mention d'un paramètre Remember-Me dans la documentation JS, mais je ne vois aucun équivalent pour Android/Java.

Vous vous demandez s'il manque quelque chose dans la documentation ou si ce n'est pas possible pour Android?

Merci de votre aide,

Neil.

Edit: exemple de code ajouté.

Création d'utilisateur ....

public void registerUserForChat(final MyApplication application, String email, String password) {
    Firebase ref = new Firebase(FIREBASE_URL);
    SimpleLogin authClient = new SimpleLogin(ref);
    authClient.createUser(email, password, new SimpleLoginAuthenticatedHandler() {
        @Override
        public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
            if(error != null) {
                Log.e(TAG, "Error attempting to create new Firebase User: " + error);
            }
            else {
                Log.d(TAG, "User successfully registered for Firebase");
                application.setLoggedIntoChat(true);
            }
        }
    });
}

Utilisateur en ligne....

public void loginUserForChat(final MyApplication application,  String email, String password) {
    Log.d(TAG, "Attempting to login Firebase user...");
    Firebase ref = new Firebase(FirebaseService.FIREBASE_URL);
    final SimpleLogin authClient = new SimpleLogin(ref);
    authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler() {
        @Override
        public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
            if (error != null) {
                Log.d(TAG, "error performing check: " + error);
            } else if (user == null) {
                Log.d(TAG, "no user logged in. Will login...");
                authClient.loginWithEmail(email, password, new SimpleLoginAuthenticatedHandler() {
                    @Override
                    public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
                        if(error != null) {
                            if(com.firebase.simplelogin.enums.Error.UserDoesNotExist == error) {
                                Log.e(TAG, "UserDoesNotExist!");
                            } else {
                                Log.e(TAG, "Error attempting to login Firebase User: " + error);
                            }
                        }
                        else {
                            Log.d(TAG, "User successfully logged into Firebase");
                            application.setLoggedIntoChat(true);
                        }
                    }
                });
            } else {
                Log.d(TAG, "user is logged in");
            }
        }
    });
}

Donc, la méthode loginUserForChat vérifie d'abord si un utilisateur est connecté et, si ce n'est pas le cas, effectue la connexion. Notez que chaque fois que je lance l'application, l'enregistrement que je vois est ....

  1. Tentative de connexion à un utilisateur Firebase ...
  2. aucun utilisateur connecté.
  3. Utilisateur connecté avec succès à Firebase

Si je quitte l'application, même pendant quelques secondes, et reviens - je vois la même journalisation.

Une chose que j’ai remarquée, c’est que l’appel de checkAuthStatus ne prend aucun identifiant d’utilisateur - je suppose qu’il ne fait que rechercher any utilisateur connecté localement?

Très appréciée.

13
Neil

[Engineer chez Firebase] Pour gérer de manière transparente les sessions persistantes dans le client Java Simple Login de Firebase, vous devez utiliser le constructeur à deux arguments qui accepte un contexte Android, c'est-à-dire SimpleLogin(com.firebase.client.Firebase ref, Android.content.Context context), à chaque fois que vous instanciez le client Java Simple Login.

Voir https://www.firebase.com/docs/Java-simple-login-api/javadoc/com/firebase/simplelogin/SimpleLogin.html pour connaître la référence complète de l'API.

12
Rob DiMarco

Une autre façon - essayez ce code dans votre onCreate:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
    Intent i = new Intent(LoginActivity.this, MainActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
} else {
    // User is signed out
    Log.d(TAG, "onAuthStateChanged:signed_out");
}

Cela permettra à l'utilisateur de rester connecté en l'amenant directement à l'activité principale sans s'arrêter à l'activité d'enregistrement. de sorte que l'utilisateur sera connecté à moins que l'utilisateur clique sur la déconnexion.

8
Leenah

La bonne façon de le faire est d'utiliser l'authentification oAuth: 

1. The user logs in.
2. You generate an access token(oAuth2).
3. Android app saves the token locally.
4. Each time the comes back to the auth, he can use the token to to log in, unless the token has been revoked by you, or he changed his
password.

Heureusement, firebase a un support clé en main pour cela, docs:

https://www.firebase.com/docs/security/custom-login.htmlhttps://www.firebase.com/docs/security/authentication.html

5
Oleg Belousov

Vous pouvez le faire en utilisant cette approche pour quitter la page logi si l'utilisateur est déjà connecté.

private FirebaseAuth auth;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    auth = FirebaseAuth.getInstance();

    if (auth.getCurrentUser() != null) {
        startActivity(new Intent(Login_Activity.this, Home.class));
        finish();
    }
    setContentView(R.layout.activity_login_);
0
rajeev ranjan