获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Otentikasi Menggunakan GitHub di Android

Anda dapat mengizinkan pengguna melakukan autentikasi dengan Firebase menggunakan akun GitHub mereka dengan mengintegrasikan Login OAuth generik berbasis web ke dalam aplikasi Anda menggunakan Firebase SDK untuk menjalankan alur masuk menyeluruh.

Sebelum kamu memulai

Untuk membuat pengguna masuk menggunakan akun GitHub, Anda harus terlebih dahulu mengaktifkan GitHub sebagai penyedia masuk untuk proyek Firebase Anda:

  1. Jika Anda belum melakukannya, tambahkan Firebase ke proyek Android Anda .

  2. Di Firebase console , buka bagian Auth .
  3. Pada tab Metode masuk , aktifkan penyedia GitHub .
  4. Tambahkan ID Klien dan Rahasia Klien dari konsol pengembang penyedia itu ke konfigurasi penyedia:
    1. Daftarkan aplikasi Anda sebagai aplikasi pengembang di GitHub dan dapatkan ID Klien dan Rahasia Klien OAuth 2.0 aplikasi Anda.
    2. Pastikan URI pengalihan OAuth Firebase Anda (mis my-app-12345.firebaseapp.com/__/auth/handler ) disetel sebagai URL panggilan balik Otorisasi di halaman setelan aplikasi pada konfigurasi aplikasi GitHub Anda.
  5. Klik Simpan .
  6. Dalam file Gradle modul (tingkat aplikasi) Anda (biasanya <project>/<app-module>/build.gradle ), tambahkan dependensi untuk library Android Firebase Authentication. Sebaiknya gunakan Firebase Android BoM untuk mengontrol pembuatan versi library.

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // Add 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'
    }
    

    Dengan menggunakan Firebase Android BoM , aplikasi Anda akan selalu menggunakan versi library Firebase Android yang kompatibel.

    (Alternatif) Tambahkan dependensi library Firebase tanpa menggunakan BoM

    Jika Anda memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi pustaka Firebase di baris dependensinya.

    Perhatikan bahwa jika Anda menggunakan beberapa pustaka Firebase di aplikasi Anda, kami sangat menyarankan penggunaan BoM untuk mengelola versi pustaka, yang memastikan bahwa semua versi kompatibel.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth:21.1.0'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // Add 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'
    }
    

    Dengan menggunakan Firebase Android BoM , aplikasi Anda akan selalu menggunakan versi library Firebase Android yang kompatibel.

    (Alternatif) Tambahkan dependensi library Firebase tanpa menggunakan BoM

    Jika Anda memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi pustaka Firebase di baris dependensinya.

    Perhatikan bahwa jika Anda menggunakan beberapa pustaka Firebase di aplikasi Anda, kami sangat menyarankan penggunaan BoM untuk mengelola versi pustaka, yang memastikan bahwa semua versi kompatibel.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'
    }
    

  7. Jika Anda belum menentukan sidik jari SHA-1 aplikasi, lakukan dari halaman Setelan di Firebase console. Lihat Mengautentikasi Klien Anda untuk detail tentang cara mendapatkan sidik jari SHA-1 aplikasi Anda.

Tangani alur masuk dengan Firebase SDK

Jika Anda membuat aplikasi Android, cara termudah untuk mengautentikasi pengguna Anda dengan Firebase menggunakan akun GitHub mereka adalah dengan menangani seluruh alur masuk dengan Firebase Android SDK.

Untuk menangani alur masuk dengan Firebase Android SDK, ikuti langkah-langkah berikut:

  1. Buat instance OAuthProvider menggunakan Builder -nya dengan ID penyedia github.com

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
    
  2. Opsional : Tentukan parameter OAuth khusus tambahan yang ingin Anda kirim dengan permintaan OAuth.

    // Target specific email with login hint.
    provider.addCustomParameter("login", "your-email@gmail.com");
    

    Untuk parameter yang didukung GitHub, lihat dokumentasi GitHub OAuth . Perhatikan bahwa Anda tidak dapat meneruskan parameter yang diperlukan Firebase dengan setCustomParameters() . Parameter tersebut adalah client_id , response_type , redirect_uri , state , scope dan response_mode .

  3. Opsional : Tentukan cakupan OAuth 2.0 tambahan di luar profil dasar yang ingin Anda minta dari penyedia autentikasi. Jika aplikasi Anda memerlukan akses ke data pengguna pribadi dari API GitHub, Anda harus meminta izin untuk mengakses API GitHub di bawah Izin API di konsol pengembang GitHub. Cakupan OAuth yang diminta harus sama persis dengan cakupan yang telah dikonfigurasi sebelumnya dalam izin API aplikasi.

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    List<String> scopes =
        new ArrayList<String>() {
          {
            add("user:email");
          }
        };
    provider.setScopes(scopes);
    
  4. Mengautentikasi dengan Firebase menggunakan objek penyedia OAuth. Perhatikan bahwa tidak seperti operasi FirebaseAuth lainnya, ini akan mengontrol UI Anda dengan memunculkan Tab Chrome Khusus . Akibatnya, jangan merujuk Aktivitas Anda di OnSuccessListener dan OnFailureListener yang Anda lampirkan karena keduanya akan segera terlepas saat operasi memulai UI.

    Anda harus terlebih dahulu memeriksa apakah Anda sudah menerima tanggapan. Masuk melalui metode ini menempatkan Aktivitas Anda di latar belakang, yang berarti dapat diklaim kembali oleh sistem selama alur masuk. Untuk memastikan bahwa Anda tidak membuat pengguna mencoba lagi jika ini terjadi, Anda harus memeriksa apakah hasilnya sudah ada.

    Untuk memeriksa apakah ada hasil yang tertunda, panggil getPendingAuthResult :

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
      // There's something already here! Finish the sign-in for your user.
      pendingResultTask
          .addOnSuccessListener(
              new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                  // User is signed in.
                  // IdP data available in
                  // authResult.getAdditionalUserInfo().getProfile().
                  // The OAuth access token can also be retrieved:
                  // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                }
              })
          .addOnFailureListener(
              new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                  // Handle failure.
                }
              });
    } else {
      // There's no pending result so you need to start the sign-in flow.
      // See below.
    }
    

    Untuk memulai alur masuk, panggil startActivityForSignInWithProvider :

    firebaseAuth
        .startActivityForSignInWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

    Setelah berhasil diselesaikan, token akses OAuth yang terkait dengan penyedia dapat diambil dari objek OAuthCredential yang dikembalikan.

    Dengan menggunakan token akses OAuth, Anda dapat memanggil GitHub API .

    Misalnya, untuk mendapatkan informasi profil dasar, Anda dapat memanggil REST API, dengan meneruskan token akses di header Authorization :

  5. Sementara contoh di atas berfokus pada alur masuk, Anda juga memiliki kemampuan untuk menautkan penyedia GitHub ke pengguna yang ada menggunakan startActivityForLinkWithProvider . Misalnya, Anda dapat menautkan beberapa penyedia ke pengguna yang sama yang memungkinkan mereka masuk dengan salah satunya.

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // GitHub credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
    
  6. Pola yang sama dapat digunakan dengan startActivityForReauthenticateWithProvider yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login baru-baru ini.

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is re-authenticated with fresh tokens and
                // should be able to perform sensitive operations
                // like account deletion and email or password
                // update.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

Langkah selanjutnya

Setelah pengguna masuk untuk pertama kalinya, akun pengguna baru dibuat dan ditautkan ke kredensial—yaitu, nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi—yang digunakan pengguna untuk masuk. Akun baru ini disimpan sebagai bagian dari proyek Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam proyek Anda, terlepas dari cara pengguna masuk.

  • Di aplikasi, Anda bisa mendapatkan informasi profil dasar pengguna dari objek FirebaseUser . Lihat Kelola Pengguna .

  • Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage , Anda bisa mendapatkan ID pengguna unik pengguna yang masuk dari variabel auth , dan menggunakannya untuk mengontrol data apa yang dapat diakses pengguna.

Anda dapat mengizinkan pengguna untuk masuk ke aplikasi Anda menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.

Untuk mengeluarkan pengguna, panggil signOut :

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()