Nouman Tahir
Nouman Tahir

Reputation: 849

React Native - Firebase auth persistence not working

Firebase auth does not persist logged in user and everytime I refresh or reopen app I have to sign in again.

I have tried setting persistence to local and the callback does verify its set but the persistence is still no working

For setting persistence I am using...

  //set auth persistence
  firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)
    .then(function() {
      console.log("successfully set the persistence");

    })
    .catch(function(error){
    console.log("failed to ser persistence: " + error.message)
  });

. . . For signing in I am using this code

firebase.auth().signInWithEmailAndPassword(email, password)
      .then((user) =>{
        this.checkAccountStatus(user.uid, user.email);
      })
      .catch(function(error) {
      // Handle Errors here.

      var errorCode = error.code;
      var errorMessage = error.message;

      console.log(errorMessage)
      // ...
    });

And here is the code I am using to check login status...

if (firebase.auth().currentUser) {
        const currentUser = firebase.auth().currentUser;
        console.log("Signed in username" + currentUser.displayName);

        this.props.navigation.navigate('AppTab');
      }else{
        console.log("no user signed in");
        this.props.navigation.navigate('AuthTab');
      }

if there anything I am not doing right

Upvotes: 22

Views: 19385

Answers (3)

Aun Abbas
Aun Abbas

Reputation: 590

Firebase now recommends to use firestore instead of realtime-database and it manages offline persistence by default. It is clear in its documentation here

You just need to access the user through this code:

if (auth().currentUser !== null) {
      console.log('User is logged in');
      console.log(auth().currentUser.email);
      props.navigation.navigate('Home');
    } else {
      props.navigation.navigate('Login');
}

This code will prop you to home screen if user is logged-in, even when you close the app. To clear the user's credentials, you manually need to sign-out the user using this code.

try {
      auth()
        .signOut()
        .then(props.navigation.navigate('Login'));
    } catch (error) {
      Alert.alert('Error', error.toString());
}

You can also check this simple app (used react hooks in it) for further assistance.

Upvotes: 2

soutot
soutot

Reputation: 3671

You don't need to set persistence. Firebase handles it for you by default. You just need to call this function to check whether user is logged or not:

firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        console.log('user is logged');
      }
});

This will not be triggered only if user has sign out or cleaned app data.

You can find more details in the official docs: https://firebase.google.com/docs/auth/web/manage-users

Hope it helps.

Upvotes: 25

Wolfmeister
Wolfmeister

Reputation: 51

Make sure you do not restrict the 'Token Service API' in the console, with the API key you are using. I did not add the service to my key, and it logged me out every 3-4 hours, even with the right code suggested above.

Upvotes: 5

Related Questions