Buka konsol

Melakukan Autentikasi Menggunakan GitHub di iOS

Anda dapat mengizinkan pengguna untuk melakukan autentikasi dengan Firebase menggunakan penyedia OAuth, seperti GitHub, dengan mengintegrasikan Login OAuth umum ke aplikasi Anda menggunakan Firebase SDK untuk menjalankan alur login secara menyeluruh.

Sebelum Anda memulai

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

  1. Tambahkan Firebase ke project iOS.
    pod 'Firebase/Auth'
  2. Di Firebase console, buka bagian Auth.
  3. Pada tab Metode login, aktifkan penyedia GitHub.
  4. Tambahkan ID Klien dan Rahasia Klien dari konsol developer penyedia tersebut ke konfigurasi penyedia:
    1. Daftarkan aplikasi Anda sebagai aplikasi developer di GitHub, lalu dapatkan ID Klien dan Rahasia Klien OAuth 2.0 untuk aplikasi Anda.
    2. Kemudian, pastikan URI pengalihan OAuth Firebase Anda (misalnya, my-app-12345.firebaseapp.com/__/auth/handler) ditetapkan sebagai URL callback otorisasi di halaman setelan aplikasi pada konfigurasi aplikasi GitHub.
  5. Klik Simpan.

Menangani alur login dengan Firebase SDK

Untuk memproses alur login dengan Firebase iOS SDK, ikuti langkah-langkah berikut:

  1. Tambahkan skema URL kustom ke project Xcode Anda:

    1. Buka konfigurasi project, klik dua kali pada nama project di tampilan hierarki sebelah kiri. Pilih aplikasi dari bagian TARGET, lalu pilih tab Info, dan perluas bagian Jenis URL.
    2. Klik tombol +, lalu tambahkan skema URL untuk ID klien terbalik Anda. Cara menemukan nilai ini, buka konfigurasi file GoogleService-Info.plist, lalu cari kunci REVERSED_CLIENT_ID. Salin nilai kunci tersebut, lalu tempel ke dalam kotak Skema URL pada halaman konfigurasi. Biarkan kolom lainnya kosong.

      Jika sudah selesai, konfigurasi akan terlihat seperti berikut (tapi dengan nilai khusus aplikasi Anda):

  2. Buat instance OAuthProvider menggunakan ID penyedia github.com.

    Swift

        var provider = OAuthProvider(providerID: "github.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
        
  3. Opsional: Tentukan parameter OAuth kustom tambahan yang ingin dikirim dengan permintaan OAuth.

    Swift

        provider.customParameters = [
          "allow_signup": "false"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"allow_signup": @"false"}];
        

    Untuk parameter yang didukung GitHub, baca bagian dokumentasi OAuth GitHub. Perlu diperhatikan, Anda tidak dapat meneruskan beberapa parameter yang diperlukan Firebase dengan setCustomParameters. Beberapa parameter tersebut antara lain client_id, redirect_uri, response_type, scope, dan state.

  4. Opsional: Tentukan cakupan OAuth 2.0 tambahan di luar profil dasar yang ingin diminta dari penyedia autentikasi. Jika aplikasi Anda memerlukan akses ke data pengguna pribadi dari GitHub API, Anda harus meminta izin untuk mengakses GitHub API di bagian Izin API pada konsol developer GitHub. Cakupan OAuth yang diminta harus sama persis dengan yang sudah dikonfigurasikan di izin API aplikasi.

    Swift

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["user:email"]
        

    Objective-C

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"user:email"]];
        

    Untuk mempelajari lebih lanjut, baca dokumenasi cakupan GitHub.

  5. Opsional: Jika Anda ingin menyesuaikan cara aplikasi menyajikan SFSafariViewController atau UIWebView saat menampilkan reCAPTCHA kepada pengguna, buat class kustom yang sesuai dengan protokol FIRAuthUIDelegate, lalu teruskan ke getCredentialWithUIDelegate:completion:.

  6. Lakukan autentikasi dengan Firebase menggunakan objek penyedia OAuth.

    Swift

        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signIn(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // GitHub OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // authResult.credential.idToken
            }
          }
        }
        

    Objective-C

        [provider getCredentialWithUIDelegate:nil
                                   completion:^(FIRAuthCredential *_Nullable credential,
                                                NSError *_Nullable error) {
          if (error) {
           // Handle error.
          }
          if (credential) {
            [[FIRAuth auth] signInWithCredential:credential
                                      completion:^(FIRAuthDataResult *_Nullable authResult,
                                                NSError *_Nullable error) {
              if (error) {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // GitHub OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // authResult.credential.idToken
            }];
          }
        }];
        

    Dengan token akses OAuth, Anda dapat memanggil GitHub API.

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

    https://api.github.com/user
    
  7. Meskipun contoh di atas berfokus pada alur login, Anda juga dapat menautkan penyedia GitHub ke pengguna yang ada. Misalnya, Anda dapat menautkan beberapa penyedia ke pengguna yang sama sehingga ia dapat login dengan salah satu penyedia tersebut.

    Swift

        Auth().currentUser.link(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }];
        
  8. Pola yang sama dapat digunakan dengan reauthenticateWithCredential, yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login terbaru.

    Swift

        Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }];
        

Langkah berikutnya

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

  • Di aplikasi, Anda bisa memperoleh informasi profil dasar pengguna dari objek FIRUser . Lihat Mengelola Pengguna.

  • Dalam Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda dapat memperoleh ID unik milik pengguna yang login dari variabel auth, dan menggunakannya untuk mengontrol data yang dapat diakses pengguna.

Anda dapat mengizinkan pengguna untuk login ke aplikasi Anda menggunakan beberapa penyedia autentikasi. Caranya, tautkan kredensial penyedia autentikasi ke akun pengguna yang ada.

Agar pengguna logout, panggil signOut:.

Swift

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
}  

Objective-C

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Mungkin Anda juga ingin menambahkan kode penanganan error untuk berbagai error autentikasi. Lihat Menangani Error.