Google Signing using Firebase Authentication in Android
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 into the app. Firebase offers a great number of options to implement Login in your app like Email, Phone number, Google, Facebook, etc.
What We Are Going to Build in this Article?
Here is a sample video of what we are going to build in this article. We will be implementing this application in both Java and Kotlin Programming Languages for Android.
Step By Step Implementation
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. The code for that has been given in both Java and Kotlin Programming Language for Android.
Step 2: Connecting Firebase with the Application
- Navigate to the Website.
- Go to the Console.
- Add Project.
Name your project and click on continue and Connect your firebase to your google account.
After completion of the project, the following interface will appear.
Now enter the package name and the name of your application. To enter the SHA-1 value follow the steps:
Go to Gradle > Task > android > signing report
After opening the signing report you will get the value of SHA-1 as shown below. Copy it and use it in firebase.
After completing the above step download the google-services.json config file provided there and paste it into android studio.
Navigate to project > app > src and paste it
Go to authentication.
Go to Sign-in-method and enable google sign-in.
Step 3: Adding Required Dependencies & Plugins
Navigate to Gradle Scripts > build.gradle(project) and add the following dependency to it:
classpath 'com.google.gms:google-services:4.3.10'
Navigate to Gradle Scripts > build.gradle(module) and add the following plugin to it:
apply plugin: 'com.google.gms.google-services'
Navigate to Gradle Scripts > build.gradle(module) and add the following dependencies in it:
implementation 'com.google.firebase:firebase-auth:19.4.0' implementation 'com.google.android.gms:play-services-auth:18.1.0' implementation 'com.github.bumptech.glide:glide:4.11.0'
Step 4: Adding Internet Permission
Go to the AndroidManifest.xml file and add the following piece of code to it-
<uses-permission android:name="android.permission.INTERNET"/>
Step 5: Working with XML Files
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" ?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".MainActivity" > < com.google.android.gms.common.SignInButton android:id = "@+id/bt_sign_in" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_centerInParent = "true" android:layout_marginStart = "16dp" android:layout_marginTop = "16dp" android:layout_marginEnd = "16dp" android:layout_marginBottom = "16dp" /> </ RelativeLayout > |
Navigate to app > right-click > new > activity > empty activity and name it as ProfileActivity. Use the following code in the activity_profile.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" android:gravity = "center" android:orientation = "vertical" android:padding = "16dp" tools:context = ".ProfileActivity" > < ImageView android:id = "@+id/iv_image" android:layout_width = "150dp" android:layout_height = "150dp" /> < TextView android:id = "@+id/tv_name" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:textColor = "@color/design_default_color_primary" android:textSize = "24sp" android:textStyle = "bold" /> < Button android:id = "@+id/bt_logout" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginTop = "32dp" android:text = "Logout" /> </ LinearLayout > |
Step 6: Working with MainActivity File
Go to the MainActivity file and refer to the following code. Below is the code for the MainActivity.java file. Comments are added inside the code to understand the code in more detail.
Java
import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; 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.SignInButton; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; public class MainActivity extends AppCompatActivity { // Initialize variables SignInButton btSignIn; GoogleSignInClient googleSignInClient; FirebaseAuth firebaseAuth; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Assign variable btSignIn = findViewById(R.id.bt_sign_in); // Initialize sign in options the client-id is copied form google-services.json file GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken( "438431947620-ecpi41uk3dhhf4mv8g8q993k3vs49ltm.apps.googleusercontent.com" ) .requestEmail() .build(); // Initialize sign in client googleSignInClient = GoogleSignIn.getClient(MainActivity. this , googleSignInOptions); btSignIn.setOnClickListener((View.OnClickListener) view -> { // Initialize sign in intent Intent intent = googleSignInClient.getSignInIntent(); // Start activity for result startActivityForResult(intent, 100 ); }); // Initialize firebase auth firebaseAuth = FirebaseAuth.getInstance(); // Initialize firebase user FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); // Check condition if (firebaseUser != null ) { // When user already sign in redirect to profile activity startActivity( new Intent(MainActivity. this , ProfileActivity. class ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } } @Override protected void onActivityResult( int requestCode, int resultCode, @Nullable Intent data) { super .onActivityResult(requestCode, resultCode, data); // Check condition if (requestCode == 100 ) { // When request code is equal to 100 initialize task Task<GoogleSignInAccount> signInAccountTask = GoogleSignIn.getSignedInAccountFromIntent(data); // check condition if (signInAccountTask.isSuccessful()) { // When google sign in successful initialize string String s = "Google sign in successful" ; // Display Toast displayToast(s); // Initialize sign in account try { // Initialize sign in account GoogleSignInAccount googleSignInAccount = signInAccountTask.getResult(ApiException. class ); // Check condition if (googleSignInAccount != null ) { // When sign in account is not equal to null initialize auth credential AuthCredential authCredential = GoogleAuthProvider.getCredential(googleSignInAccount.getIdToken(), null ); // Check credential firebaseAuth.signInWithCredential(authCredential).addOnCompleteListener( this , new OnCompleteListener<AuthResult>() { @Override public void onComplete( @NonNull Task<AuthResult> task) { // Check condition if (task.isSuccessful()) { // When task is successful redirect to profile activity display Toast startActivity( new Intent(MainActivity. this , ProfileActivity. class ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); displayToast( "Firebase authentication successful" ); } else { // When task is unsuccessful display Toast displayToast( "Authentication Failed :" + task.getException().getMessage()); } } }); } } catch (ApiException e) { e.printStackTrace(); } } } } private void displayToast(String s) { Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); } } |
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.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.SignInButton import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task import com.google.firebase.auth.AuthCredential import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.GoogleAuthProvider class MainActivity : AppCompatActivity() { // Initialize variables lateinit var btSignIn: SignInButton lateinit var googleSignInClient: GoogleSignInClient private lateinit var firebaseAuth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Assign variable btSignIn = findViewById(R.id.bt_sign_in) // Initialize sign in options the client-id is copied form google-services.json file val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken( "438431947620-ecpi41uk3dhhf4mv8g8q993k3vs49ltm.apps.googleusercontent.com" ) .requestEmail() .build() // Initialize sign in client googleSignInClient = GoogleSignIn.getClient( this @MainActivity , googleSignInOptions) btSignIn.setOnClickListener { // Initialize sign in intent val intent: Intent = googleSignInClient.signInIntent // Start activity for result startActivityForResult(intent, 100 ) } // Initialize firebase auth firebaseAuth = FirebaseAuth.getInstance() // Initialize firebase user val firebaseUser: FirebaseUser? = firebaseAuth.currentUser // Check condition if (firebaseUser != null ) { // When user already sign in redirect to profile activity startActivity( Intent( this @MainActivity , ProfileActivity:: class .java ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super .onActivityResult(requestCode, resultCode, data) // Check condition if (requestCode == 100 ) { // When request code is equal to 100 initialize task val signInAccountTask: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data) // check condition if (signInAccountTask.isSuccessful) { // When google sign in successful initialize string val s = "Google sign in successful" // Display Toast displayToast(s) // Initialize sign in account try { // Initialize sign in account val googleSignInAccount = signInAccountTask.getResult(ApiException:: class .java) // Check condition if (googleSignInAccount != null ) { // When sign in account is not equal to null initialize auth credential val authCredential: AuthCredential = GoogleAuthProvider.getCredential( googleSignInAccount.idToken, null ) // Check credential firebaseAuth.signInWithCredential(authCredential) .addOnCompleteListener( this ) { task -> // Check condition if (task.isSuccessful) { // When task is successful redirect to profile activity startActivity( Intent( this @MainActivity , ProfileActivity:: class .java ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ) // Display Toast displayToast( "Firebase authentication successful" ) } else { // When task is unsuccessful display Toast displayToast( "Authentication Failed :" + task.exception.message ) } } } } catch (e: ApiException) { e.printStackTrace() } } } } private fun displayToast(s: String) { Toast.makeText(applicationContext, s, Toast.LENGTH_SHORT).show() } } |
Go to the ProfileActivity file and use the following code in it:
Java
import android.os.Bundle; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.bumptech.glide.Glide; 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.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class ProfileActivity extends AppCompatActivity { // Initialize variable ImageView ivImage; TextView tvName; Button btLogout; FirebaseAuth firebaseAuth; GoogleSignInClient googleSignInClient; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_profile); // Assign variable ivImage = findViewById(R.id.iv_image); tvName = findViewById(R.id.tv_name); btLogout = findViewById(R.id.bt_logout); // Initialize firebase auth firebaseAuth = FirebaseAuth.getInstance(); // Initialize firebase user FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); // Check condition if (firebaseUser != null ) { // When firebase user is not equal to null set image on image view Glide.with(ProfileActivity. this ).load(firebaseUser.getPhotoUrl()).into(ivImage); // set name on text view tvName.setText(firebaseUser.getDisplayName()); } // Initialize sign in client googleSignInClient = GoogleSignIn.getClient(ProfileActivity. this , GoogleSignInOptions.DEFAULT_SIGN_IN); btLogout.setOnClickListener(view -> { // Sign out from google googleSignInClient.signOut().addOnCompleteListener( new OnCompleteListener<Void>() { @Override public void onComplete( @NonNull Task<Void> task) { // Check condition if (task.isSuccessful()) { // When task is successful sign out from firebase firebaseAuth.signOut(); // Display Toast Toast.makeText(getApplicationContext(), "Logout successful" , Toast.LENGTH_SHORT).show(); // Finish activity finish(); } } }); }); } } |
Kotlin
import android.os.Bundle import android.widget.Button import android.widget.ImageView import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide 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 class ProfileActivity : AppCompatActivity() { // Initialize variable lateinit var ivImage: ImageView lateinit var tvName: TextView lateinit var btLogout: Button lateinit var firebaseAuth: FirebaseAuth lateinit var googleSignInClient: GoogleSignInClient override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_profile) // Assign variable ivImage = findViewById(R.id.iv_image) tvName = findViewById(R.id.tv_name) btLogout = findViewById(R.id.bt_logout) // Initialize firebase auth firebaseAuth = FirebaseAuth.getInstance() // Initialize firebase user val firebaseUser = firebaseAuth.currentUser // Check condition if (firebaseUser != null ) { // When firebase user is not equal to null set image on image view Glide.with( this @ProfileActivity ).load(firebaseUser.photoUrl).into(ivImage) // set name on text view tvName.text = firebaseUser.displayName } // Initialize sign in client googleSignInClient = GoogleSignIn.getClient( this @ProfileActivity , GoogleSignInOptions.DEFAULT_SIGN_IN) btLogout.setOnClickListener { // Sign out from google googleSignInClient.signOut().addOnCompleteListener { task -> // Check condition if (task.isSuccessful) { // When task is successful sign out from firebase firebaseAuth.signOut() // Display Toast Toast.makeText(applicationContext, "Logout successful" , Toast.LENGTH_SHORT).show() // Finish activity finish() } } } } } |
Contact Us