ورود به حساب کاربری گوگل با استفاده از فایربیس


کار با حساب کاربری گوگل با استفاده از فایربیس

در واقع می توان با استفاده از فایربیس امکان ورود به حساب کاربری را در برنامه فراهم کنیم. مراحل اجرای این آموزش بسیار ساده است. همان طور که می دانید فایربیس یک سرویس جامع برای برنامه نویسان است. برای مثال پروژه های اعتبار سنجی، گزارش کرش برنامه روی دیوایس کاربران، FCM، ساخت دیتابیس و … می توانند با استفاده از فایربیس به خوبی انجام شوند.

مراحل ورود به حساب کاربری گوگل با استفاده از فایربیس

  • ساخت پروژه و افزودن آن به کنسول فایربیس
  • ست کردن فایربیس روی پروژه
  • فعال نمودن ورود به حساب کاربری گوگل
  • افزودن SHA مورد نیاز برای کنسول فایربیس
  • افزودن کتابخانه authentication یا اعتبارسنجی
  • ست نمودن کلاینت گوگل

قدم اول : ساخت پروژه و افزودن آن به کنسول فایربیس

پس از ساخت پروژه به کنسول فایربیس خود می رویم و پروژه را به آن اضافه می کنیم. (افزودن پروژه به کنسول فایربیس می تواند موضوع مقاله دیگری در بلاگ باشد.)

قدم دوم : فعال نمودن ورود به حساب کاربری گوگل

در فایربیس گزینه Authentication را از پنل سمت چپ انتخاب می کنیم. سپس در متدSign in گزینه Google Sign in  را مثل تصویر زیر فعال می کنیم.

قدم سوم : افزودن SHA مورد نیاز برای کنسول فایربیس

این قدم برای بکارگیری google sign in لازم است. حالا به سراغ پروژه در اندروید استودیو می رویم. برای دریافت signature  برنامه روی gradle سمت راست و بالای صفحه کلیک می کنیم. پس از انتخاب app -> task -> android گزینه singingReport را انتخاب می کنیم.

قدم چهارم : افزودن کتابخانه authentication یا اعتبارسنجی

به سراغ فایل build.gradle رفته و dependency های مربوطه را اضافه می نماییم:

implementation 'com.firebaseui:firebase-ui-auth:4.3.1'
 // Google Sign In SDK (only required for Google Sign In)
 implementation 'com.google.android.gms:play-services-auth:17.0.0'

قدم پنجم : ساخت اکتیویتی LoginActivity

در ادامه کار اکتیویتی به همراه layout مربوطه را می سازیم. layout اکتیویتی LoginActivity به شکل زیر می باشد:

<?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=".LoginActivity"
    >

  <com.google.android.gms.common.SignInButton
      android:id="@+id/sign_in_button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginStart="8dp"
      android:layout_marginTop="8dp"
      android:layout_marginEnd="8dp"
      android:layout_marginBottom="8dp"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      />

</androidx.constraintlayout.widget.ConstraintLayout>

و کلاس LoginActivity نیز مانند قطعه کد زیر می تواند باشد :

package com.googlesigninfirebase;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
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 LoginActivity extends AppCompatActivity {
  private static final String TAG = "LoginActivity";
  private static final int RC_SIGN_IN = 1001;

  GoogleSignInClient googleSignInClient;

  private FirebaseAuth firebaseAuth;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {
        // Launch Sign In
        signInToGoogle();
      }
    });

    // Configure Google Client
    configureGoogleClient();
  }

  private void configureGoogleClient() {
    // Configure Google Sign In
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        // for the requestIdToken, this is in the values.xml file that
        // is generated from your google-services.json 
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build();

    // Build a GoogleSignInClient with the options specified by gso.
    googleSignInClient = GoogleSignIn.getClient(this, gso);

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_WIDE);

    // Initialize Firebase Auth
    firebaseAuth = FirebaseAuth.getInstance();
  }

  @Override
  public void onStart() {
    super.onStart();

    // Check if user is signed in (non-null) and update UI accordingly.
    FirebaseUser currentUser = firebaseAuth.getCurrentUser();

    if (currentUser != null) {
      Log.d(TAG, "Currently Signed in: " + currentUser.getEmail());
      showToastMessage("Currently Logged in: " + currentUser.getEmail());
    }
  }

  public void signInToGoogle() {
    Intent signInIntent = googleSignInClient.getSignInIntent();
    startActivityForResult(signInIntent, RC_SIGN_IN);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
      Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
      try {
        // Google Sign In was successful, authenticate with Firebase
        GoogleSignInAccount account = task.getResult(ApiException.class);
        showToastMessage("Google Sign in Succeeded");
        firebaseAuthWithGoogle(account);
      } catch (ApiException e) {
        // Google Sign In failed, update UI appropriately
        Log.w(TAG, "Google sign in failed", e);
        showToastMessage("Google Sign in Failed " + e);
      }
    }
  }

  private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
    Log.d(TAG, "firebaseAuthWithGoogle:" + account.getId());

    AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    firebaseAuth.signInWithCredential(credential)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
          @Override
          public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {
              // Sign in success, update UI with the signed-in user's information
              FirebaseUser user = firebaseAuth.getCurrentUser();

              Log.d(TAG, "signInWithCredential:success: currentUser: " + user.getEmail());

              showToastMessage("Firebase Authentication Succeeded ");
              launchMainActivity(user);
            } else {
              // If sign in fails, display a message to the user.

              Log.w(TAG, "signInWithCredential:failure", task.getException());

              showToastMessage("Firebase Authentication failed:" + task.getException());
            }
          }
        });
  }

  private void showToastMessage(String message) {
    Toast.makeText(LoginActivity.this, message, Toast.LENGTH_LONG).show();
  }

  private void launchMainActivity(FirebaseUser user) {
    if (user != null) {
      MainActivity.startActivity(this, user.getDisplayName());
      finish();
    }
  }
}

قدم آخر : تکمیل نمودن MainActivity

layout مربوطه به شکل زیر می باشد:

<?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"
    >


  <Button
      android:id="@+id/buttonLogout"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginBottom="16dp"
      android:text="@string/logout"
      android:textAllCaps="false"
      app:layout_constraintBottom_toTopOf="@+id/buttonDisconnect"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      />
  <Button
      android:id="@+id/buttonDisconnect"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/revoke_access"
      android:textAllCaps="false"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      />
  <TextView
      android:id="@+id/textViewWelcome"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginBottom="32dp"
      android:text="@string/welcome"
      android:gravity="center"
      app:layout_constraintBottom_toTopOf="@+id/buttonLogout"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      />
</androidx.constraintlayout.widget.ConstraintLayout>

و در نهایت کلاس MainActivity:

package com.googlesigninfirebase;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
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.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  private static final String TAG = "MainActivity";
  private static final String ARG_NAME = "username";

  public static void startActivity(Context context, String username) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra(ARG_NAME, username);
    context.startActivity(intent);
  }

  FirebaseAuth firebaseAuth;
  GoogleSignInClient googleSignInClient;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView textView = findViewById(R.id.textViewWelcome);
    if (getIntent().hasExtra(ARG_NAME)) {
      textView.setText(String.format("Welcome - %s", getIntent().getStringExtra(ARG_NAME)));
    }
    findViewById(R.id.buttonLogout).setOnClickListener(this);
    findViewById(R.id.buttonDisconnect).setOnClickListener(this);

    googleSignInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_SIGN_IN);
    firebaseAuth = FirebaseAuth.getInstance();
  }

  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.buttonLogout:
        signOut();
        break;
      case R.id.buttonDisconnect:
        revokeAccess();
        break;
    }
  }

  private void signOut() {
    // Firebase sign out
    firebaseAuth.signOut();

    // Google sign out
    googleSignInClient.signOut().addOnCompleteListener(this,
        new OnCompleteListener<Void>() {
          @Override
          public void onComplete(@NonNull Task<Void> task) {
            // Google Sign In failed, update UI appropriately
            Log.w(TAG, "Signed out of google");
          }
        });
  }

  private void revokeAccess() {
    // Firebase sign out
    firebaseAuth.signOut();

    // Google revoke access
    googleSignInClient.revokeAccess().addOnCompleteListener(this,
        new OnCompleteListener<Void>() {
          @Override
          public void onComplete(@NonNull Task<Void> task) {
            // Google Sign In failed, update UI appropriately
            Log.w(TAG, "Revoked Access");
          }
        });
  }
}

 

به این پست امتیاز دهید

روی ستاره های کلیک کنید و امتیاز بدید

میانگین امتیاز 2.3 / 5. تعداد: 3

از امتیاز شما متشکریم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Enter Captcha Here : *

Reload Image