Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase Android Auto Login

So I setup email/password register and login.

That is working. I thought Firebase took care of this but apparently not. I want, after the user closes the app, to be logged in already next time they open the app.

What is missing?

class LoginActivity : AppCompatActivity(){
    lateinit var auth: FirebaseAuth
    lateinit var user: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        auth = FirebaseAuth.getInstance()
    }

    fun loginLoginClicked(view: View) {
        // Perform login

        val email = loginEmailTxt.text.toString()
        val password = loginPasswordTxt.text.toString()

        auth.signInWithEmailAndPassword(email, password)
                .addOnSuccessListener {
                    finish()
                }
                .addOnFailureListener { exception ->
                    Log.e("Exception", "Could not sign in user - ${exception.localizedMessage}")
                }
        val loginIntent = Intent(this, MainActivity::class.java)
        startActivity(loginIntent)
    }

    fun loginCreateClicked(view: View) {
        // segue to the create user activity

        val createIntent = Intent(this, SignUpActivity::class.java)
        startActivity(createIntent)
    }}
}
like image 757
JDOEs Avatar asked Jan 04 '23 04:01

JDOEs


1 Answers

Firebase Authentication does automatically remember authentication state, so the user will still be authenticated when the app is restarted.

However, if your LoginActivity is the launcher activity, you'll still land on this activity, so you'll need to check whether the user is authenticated in onCreate(), and then redirect them to your MainActivity if they are already logged in, something like:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    auth = FirebaseAuth.getInstance();

    if (auth.getCurrentUser() != null) {
        // User is signed in (getCurrentUser() will be null if not signed in)
        val intent = Intent(this, MainActivity::class.java);
        startActivity(intent);
        finish();
    }
}

This makes use of the FirebaseAuth#getCurrentUser() method that will return a FirebaseUser object if the user is logged in, or null if they are not logged in.

Alternatively, you could swap it around so that the MainActivity is the launcher activity and then only show your LoginActivity if the user is not logged in.

....

like image 175
Grimthorr Avatar answered Jan 13 '23 13:01

Grimthorr