Аутентификация с помощью GitHub на Android

Опубликовано: 1 Сентября, 2022

GitHub — это место, где более 65 миллионов разработчиков вместе формируют будущее программного обеспечения. Вносите свой вклад в сообщество разработчиков ПО с открытым исходным кодом, управляйте своими репозиториями Git, просматривайте код как профессионал, отслеживайте ошибки и функции, повышайте эффективность рабочих процессов CI/CD и DevOps и защищайте код перед его фиксацией. Итак, в этой статье мы собираемся обсудить, как пройти аутентификацию с помощью GitHub в вашем приложении для Android с помощью аутентификации пользователя Firebase.

Шаги для аутентификации пользователя Firebase с использованием GitHub

Шаг 1:

Создайте новый проект в студии Android или откройте любой существующий проект, с помощью которого вы хотите аутентифицировать пользователя с помощью GitHub, и добавьте firebase в это приложение для Android. Шаги по добавлению firebase в ваше приложение.

Шаг 2:

Перейдите в консоль Firebase, перейдите в свое приложение, затем перейдите к настройкам проекта и добавьте SHA1, похожий на отпечаток пальца, вашего подключенного приложения. Чтобы найти SHA1, перейдите в Gradle (правая часть окна Android-студии) > имя вашего приложения > Задачи > Android > signingReport (дважды щелкните по нему)

Note: Make sure to add google-services.json in your application, otherwise, download it from the project settings of the firebase console and add it to your application.

Шаг 3:

Вернитесь к своему приложению в консоли firebase, перейдите к аутентификации (левая панель firebase), затем перейдите к методу входа, чтобы включить поставщика GitHub.

Включить GitHub

Требовать идентификатор клиента и секрет клиента

Теперь нам нужны идентификатор клиента и секрет клиента . Для этого зарегистрируйте свое приложение в качестве приложения разработчика на GitHub и получите идентификатор клиента OAuth 2.0 своего приложения и секрет клиента. Чтобы зарегистрировать свое приложение, введите имя приложения, введите URL-адрес домашней страницы веб-сайта приложения (здесь я даю тот же URL-адрес, что и в URL-адресе обратного вызова авторизации) и предоставьте краткое описание приложения.

Note: Make sure your Firebase OAuth redirect URI (e.g. my-app-12345.firebaseapp.com/__/auth/handler) is set as your Authorization callback URL in your app’s settings page on your GitHub app’s config. 

Получите авторизованный URL-адрес обратного вызова , как показано на изображении ниже.

Щелкните Зарегистрировать приложение . Вы получите свой идентификатор клиента и секрет клиента , скопируйте и вставьте их в консоль firebase (под методом входа) и нажмите кнопку «Сохранить», чтобы включить GitHub.

Шаг 4:

Вернитесь в андроид-студию. Добавьте зависимость для Android-библиотеки Firebase Authentication в build.gradle (модуль: your-application-name.app) с помощью Firebase Android BoM.

dependencies {

   // Import the BoM for the Firebase platform

   implementation platform(‘com.google.firebase:firebase-bom:28.0.1’)

   // Declare the dependency for the Firebase Authentication library

   // When using the BoM, you don’t specify versions in Firebase library dependencies

   implementation ‘com.google.firebase:firebase-auth-ktx’

}

Используя Firebase Android BoM , ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android .

Шаг 5: Работа с файлом MainActivity

Перейдите к приложению > res > layout > activity_main.xml и добавьте приведенный ниже код в этот файл. Ниже приведен код файла activity_main.xml .

XML




<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
  
  
        <EditText
            android:id="@+id/githubId"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="100dp"
            android:hint="Enter your email associated with github"
            android:padding="8dp"
            android:textAlignment="center"
            android:textColor="#118016" />
  
        <Button
            android:id="@+id/github_login_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="100dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="100dp"
            android:layout_marginBottom="100dp"
            android:backgroundTint="#fff"
            android:drawableLeft="@drawable/github"
            android:drawablePadding="8dp"
            android:padding="8dp"
            android:text="@string/log_in_with_github"
            android:textAllCaps="false"
            android:textColor="#000" />
    </LinearLayout>
    
</androidx.constraintlayout.widget.ConstraintLayout>

Перейдите к файлу MainActivity.kt и обратитесь к следующему коду. Ниже приведен код файла MainActivity.kt . Комментарии добавляются внутри кода, чтобы понять код более подробно.

Kotlin




import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.tasks.OnFailureListener
import com.google.android.gms.tasks.OnSuccessListener
import com.google.android.gms.tasks.Task
import com.google.firebase.auth.AuthResult
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.auth.OAuthProvider
  
class MainActivity : AppCompatActivity() {
  
    private lateinit var firebaseUser: FirebaseUser
    private lateinit var loginBtn: Button
    private lateinit var githubEdit: EditText
  
    // firebaseAuth variable to be initialized later
    private lateinit var auth: FirebaseAuth
  
    // an instance of an OAuthProvider using its Builder
      // with the provider ID github.com
    private val provider = OAuthProvider.newBuilder("github.com")
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        loginBtn = findViewById(R.id.github_login_btn)
        githubEdit = findViewById(R.id.githubId)
          
        // initializing auth
        auth = FirebaseAuth.getInstance() 
          
          // Target specific email with login hint.
        provider.addCustomParameter("login", githubEdit.text.toString())
  
        // Request read access to a user"s email addresses.
        // This must be preconfigured in the app"s API permissions.
        val scopes: ArrayList<String?> = object : ArrayList<String?>() {
            init {
                add("user:email")
            }
        }
        provider.scopes = scopes
  
        // call signInWithGithubProvider() method
          // after clicking login Button
        loginBtn.setOnClickListener {
            if (TextUtils.isEmpty(githubEdit.text.toString())) {
                Toast.makeText(this, "Enter your github id", Toast.LENGTH_LONG).show()
            } else {
                signInWithGithubProvider()
            }
        }
    }
  
    // To check if there is a pending result, call pendingAuthResult
    private fun signInWithGithubProvider() {
  
        // There"s something already here! Finish the sign-in for your user.
        val pendingResultTask: Task<AuthResult>? = auth.pendingAuthResult
        if (pendingResultTask != null) {
            pendingResultTask
                    .addOnSuccessListener {
                        // User is signed in.
                        Toast.makeText(this, "User exist", Toast.LENGTH_LONG).show()
                    }
                    .addOnFailureListener {
                        // Handle failure.
                        Toast.makeText(this, "Error : $it", Toast.LENGTH_LONG).show()
                    }
        } else {
  
            auth.startActivityForSignInWithProvider( /* activity= */this, provider.build())
                    .addOnSuccessListener(
                            OnSuccessListener<AuthResult?> {
                                // User is signed in.
                                // retrieve the current user
                                firebaseUser = auth.currentUser!!
                                  
                                // navigate to HomePageActivity after successful login
                                val intent = Intent(this, HomePageActivity::class.java)
                                  
                                  // send github user name from MainActivity to HomePageActivity
                                intent.putExtra("githubUserName", firebaseUser.displayName)
                                this.startActivity(intent)
                                Toast.makeText(this, "Login Successfully", Toast.LENGTH_LONG).show()
  
                            })
                    .addOnFailureListener(
                            OnFailureListener {
                                // Handle failure.
                                Toast.makeText(this, "Error : $it", Toast.LENGTH_LONG).show()
                            })
        }
  
    }
}

Шаг 6: Создайте новую пустую активность

Обратитесь к этой статье Создайте новую активность в Android Studio и создайте пустую активность. Назовите активность как HomePageActivity. Перейдите в приложение > res > layout > activity_home_page.xml и добавьте приведенный ниже код в этот файл. Ниже приведен код файла activity_home_page.xml .

XML




<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".HomePageActivity">
  
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="10dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
  
        <TextView
            android:id="@+id/headerId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="User Name :"
            android:textColor="#06590A"
            android:textSize="25sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
  
        <TextView
            android:id="@+id/id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_marginTop="10dp"
            android:hint="github Id"
            android:textAlignment="center"
            android:textSize="25sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
  
    </LinearLayout>
  
    <Button
        android:id="@+id/logOut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="456dp"
        android:layout_marginBottom="20dp"
        android:gravity="center"
        android:text="Logout"
        android:textColor="#fff"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
  
</androidx.constraintlayout.widget.ConstraintLayout>

Перейдите к файлу HomePageActivity.kt и обратитесь к следующему коду. Ниже приведен код файла HomePageActivity.kt .

Kotlin




import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
  
class HomePageActivity : AppCompatActivity() {
  
    var userName = ""
  
    private lateinit var githubUserName: TextView