Google Signing using Firebase Authentication in Kotlin
Firebase is a mobile and web application development platform. It provides services that a web application or mobile application might require. Firebase provides email and password authentication without any overhead of building the backend for user authentication. Google Sign-In is a secure way to authenticate users in your apps. It reduces the hassle of dealing with and handling those extra passwords by the user to get authenticated to the app. Firebase offers a great number of options to implement Login in your app like Email, Phone number, Google, Facebook, etc.
Step by Step Implementation
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Step 2: Connect your app to Firebase
After creating a new project in Android Studio. Connect your app to Firebase. For connecting your app to firebase. Navigate to Tools on the top bar. After that click on Firebase. A new window will open on the right side. Inside that window click on Authentication and then email and password authentication.
After clicking on email and password authentication you will get to see the below screen. Inside this screen click on the first option connect to firebase and after that click on the second option to add Firebase authentication to your app.
Add the following dependencies if it is not already present there.
implementation ‘com.google.firebase:firebase-auth:16.0.5’
implementation ‘com.google.android.gms:play-services-auth:18.1.0’
Step 3: Enable Google Sign In
Step 4: Working with the activity_main.xml file
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout android:layout_width = "match_parent" android:layout_height = "match_parent" android:gravity = "center" android:orientation = "vertical" tools:context = ".MainActivity" > < Button android:id = "@+id/Signin" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_margin = "20dp" android:padding = "20dp" android:text = "Google Sign In" android:textColor = "#000" android:textSize = "22sp" /> </ LinearLayout > |
Step 5: Working with the MainActivity.kt file
Go to the MainActivity.kt file and refer to the following code. Below is the code for the MainActivity.kt file. Comments are added inside the code to understand the code in more detail.
Kotlin
import android.content.Intent import android.os.Bundle import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.auth.api.signin.GoogleSignInClient import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task import com.google.firebase.FirebaseApp import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.GoogleAuthProvider import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { lateinit var mGoogleSignInClient: GoogleSignInClient val Req_Code: Int = 123 private lateinit var firebaseAuth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_main) FirebaseApp.initializeApp( this ) val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build() mGoogleSignInClient = GoogleSignIn.getClient( this , gso) firebaseAuth = FirebaseAuth.getInstance() Signin.setOnClickListener { view: View? -> Toast.makeText( this , "Logging In" , Toast.LENGTH_SHORT).show() signInGoogle() } } private fun signInGoogle() { val signInIntent: Intent = mGoogleSignInClient.signInIntent startActivityForResult(signInIntent, Req_Code) } // onActivityResult() function : this is where // we provide the task and data for the Google Account override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super .onActivityResult(requestCode, resultCode, data) if (requestCode == Req_Code) { val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data) handleResult(task) } } private fun handleResult(completedTask: Task<GoogleSignInAccount>) { try { val account: GoogleSignInAccount? = completedTask.getResult(ApiException:: class .java) if (account != null ) { UpdateUI(account) } } catch (e: ApiException) { Toast.makeText( this , e.toString(), Toast.LENGTH_SHORT).show() } } // this is where we update the UI after Google signin takes place private fun UpdateUI(account: GoogleSignInAccount) { val credential = GoogleAuthProvider.getCredential(account.idToken, null ) firebaseAuth.signInWithCredential(credential).addOnCompleteListener { task -> if (task.isSuccessful) { SavedPreference.setEmail( this , account.email.toString()) SavedPreference.setUsername( this , account.displayName.toString()) val intent = Intent( this , DashboardActivity:: class .java) startActivity(intent) finish() } } } override fun onStart() { super .onStart() if (GoogleSignIn.getLastSignedInAccount( this ) != null ) { startActivity( Intent( this , DashboardActivity :: class .java ) ) finish() } } } |
Step 6: Create a new empty activity
Please refer to Create New Activity in Android Studio and name the activity as DashboardActivity.
Step 7: Working with the activity_dashboard.xml file
Go to the activity_dashboard.xml file and refer to the following code. Below is the code for the activity_dashboard.xml file. Create a Button which when clicked, logs out the user from the app.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < androidx.constraintlayout.widget.ConstraintLayout android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".DashboardActivity" > < Button android:id = "@+id/logout" android:layout_width = "300dp" android:layout_height = "100dp" android:padding = "10dp" android:text = "Logout" android:textColor = "#000" android:textSize = "40sp" app:layout_constraintBottom_toBottomOf = "parent" app:layout_constraintLeft_toLeftOf = "parent" app:layout_constraintRight_toRightOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> </ androidx.constraintlayout.widget.ConstraintLayout > |
Step 8: Working with the DashboardActivity.kt file
Go to the DashboardActivity.kt file and refer to the following code. Below is the code for the DashboardActivity.kt file. Comments are added inside the code to understand the code in more detail.
Kotlin
import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInClient import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.firebase.auth.FirebaseAuth import kotlinx.android.synthetic.main.activity_dashboard.* class DashboardActivity : AppCompatActivity() { // declare the GoogleSignInClient lateinit var mGoogleSignInClient: GoogleSignInClient private val auth by lazy { FirebaseAuth.getInstance() } override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_dashboard) // call requestIdToken as follows val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build() mGoogleSignInClient = GoogleSignIn.getClient( this , gso) logout.setOnClickListener { mGoogleSignInClient.signOut().addOnCompleteListener { val intent = Intent( this , MainActivity:: class .java) Toast.makeText( this , "Logging Out" , Toast.LENGTH_SHORT).show() startActivity(intent) finish() } } } } |
Output:
Please Login to comment...