Hello Developers, in this post, we are going to implement signup, login, and logout functionality using Firebase Authentication with Coroutines in Kotlin. Firebase helps to develop for building high-quality apps and that feature works independently.
Firebase is one of the largest account databases in the world and it provides an end-to-end identity solution, supporting email and password accounts, phone auth, and Google, Twitter, Facebook, GitHub login, and more It’s a very secure authentication system.
Firebase provides a full set of authentication and it automatically stores users’ credentials securely with the help of bcrypt. Let’s build a user Authentication with Kotlin Coroutines in Android 2024 using the Firebase Database, so without any further, discussion let’s get started.
Page Contents
Firebase Authentication with Coroutines in Kotlin
Follow Firebase for Android playlist on YouTube – Firebase for Android
Step 1: Add your project with Firebase
Before going further add your project with Firebase, follow this article step by step – Getting started with Firebase on Android (2022)
Step 2: Add the required library
Add the required library for Firebase Authentication and Coroutines.
build.gradle (Module)
/* Import the Firebase BoM */ implementation platform('com.google.firebase:firebase-bom:30.1.0') implementation 'com.google.firebase:firebase-analytics-ktx' /* Firebase Authentication */ implementation 'com.google.firebase:firebase-auth-ktx:21.0.5' /* coroutines support for firebase operations */ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.0' /* Lifecycle-aware coroutine scopes */ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
Step 3: Simple UI for the Signup, Login, and Logout
Create a simple UI for the signup, login, and logout to get the email id and password from the user.
activity_signup_signin
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="16dp"> <ProgressBar android:id="@+id/progress_circular" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toTopOf="@+id/edtEmailID" app:layout_constraintEnd_toEndOf="parent" android:visibility="gone" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Firebase Authentication" android:textColor="@color/purple_500" android:textSize="24sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/edtEmailID" android:layout_width="match_parent" android:layout_height="50dp" android:background="#F4F4F4" android:hint="Enter email id" android:paddingStart="4dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline" /> <EditText android:id="@+id/edtPassword" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="8dp" android:background="#F4F4F4" android:hint="Enter password" android:paddingStart="4dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/edtEmailID" /> <Button android:id="@+id/btnSignUp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Sign up" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/edtPassword" /> <Button android:id="@+id/btnSignIn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Sign in" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btnSignUp" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.4" /> </androidx.constraintlayout.widget.ConstraintLayout>
activity_main
This XML code is responsible to create the main screen AKA Dashboard Screen
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/loginBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dashboard" android:textColor="@color/purple_500" android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btnSignOut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Logout" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginBtn" /> </androidx.constraintlayout.widget.ConstraintLayout>
Step 4: Write Authentication Logic
Now is the time to write the logic for Authentication (Signup and Login) with Kotlin Coroutines
SignUpSignInActivity.kt
package com.techpassmaster.firebasecourse import android.content.Intent import android.os.Bundle import android.util.Log import android.view.View import android.widget.Button import android.widget.EditText import android.widget.ProgressBar import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.google.firebase.auth.AuthResult import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseUser import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await import kotlinx.coroutines.withContext class SignUpSignInActivity : AppCompatActivity() { private lateinit var edtEmailId : EditText private lateinit var edtPassword : EditText private lateinit var btnSignUp : Button private lateinit var btnSignIn : Button private lateinit var mAuth: FirebaseAuth private lateinit var progressBar: ProgressBar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_signup_signin) edtEmailId = findViewById(R.id.edtEmailID) edtPassword = findViewById(R.id.edtPassword) btnSignUp = findViewById(R.id.btnSignUp) btnSignIn = findViewById(R.id.btnSignIn) progressBar = findViewById(R.id.progress_circular) mAuth = FirebaseAuth.getInstance() btnSignUp.setOnClickListener { progressBar.visibility = View.VISIBLE val emailId = edtEmailId.text.toString() val password = edtPassword.text.toString() lifecycleScope.launch(Dispatchers.IO){ signUpWithEmailAndPassword(mAuth,emailId,password) } } btnSignIn.setOnClickListener { progressBar.visibility = View.VISIBLE val emailId = edtEmailId.text.toString() val password = edtPassword.text.toString() lifecycleScope.launch(Dispatchers.IO){ signInWithEmailAndPassword(mAuth,emailId,password) } } } suspend fun signUpWithEmailAndPassword( firebaseAuth: FirebaseAuth, emailId: String, password: String) :AuthResult? { return try { val result = firebaseAuth.createUserWithEmailAndPassword(emailId,password) .await() updateUI(result.user) result } catch (e :Exception){ withContext(Dispatchers.Main){ Toast.makeText(this@SignUpSignInActivity, "${e.message}", Toast.LENGTH_SHORT).show() Log.d("AuthResult","${e.message}") progressBar.visibility = View.GONE } null } } suspend fun signInWithEmailAndPassword( firebaseAuth: FirebaseAuth, emailId: String, password: String) :AuthResult? { return try { val result = firebaseAuth.signInWithEmailAndPassword(emailId,password) .await() updateUI(result.user) result } catch (e :Exception){ withContext(Dispatchers.Main){ Toast.makeText(this@SignUpSignInActivity, "${e.message}", Toast.LENGTH_SHORT).show() Log.d("AuthResult","${e.message}") progressBar.visibility = View.GONE } null } } private suspend fun updateUI(firebaseUser :FirebaseUser?) { Log.d("AuthResult","${firebaseUser?.email}") withContext(Dispatchers.Main){ progressBar.visibility = View.GONE Toast.makeText(this@SignUpSignInActivity, "Success", Toast.LENGTH_SHORT).show() startActivity(Intent(this@SignUpSignInActivity, MainActivity::class.java)) finish() } } override fun onStart() { super.onStart() val currentUser = mAuth.currentUser if (currentUser!=null){ startActivity(Intent(this@SignUpSignInActivity, MainActivity::class.java)) finish() } } }
MainActivity.kt
In this activity, we will implement a logout functionality.
package com.techpassmaster.firebasecourse import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.firebase.auth.FirebaseAuth class MainActivity : AppCompatActivity() { private lateinit var btnSignOut :Button private lateinit var mAuth : FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btnSignOut = findViewById(R.id.btnSignOut) mAuth = FirebaseAuth.getInstance() btnSignOut.setOnClickListener { mAuth.signOut() Toast.makeText(this, "SignOut Successful", Toast.LENGTH_SHORT).show() finish() } } }