Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Otentikasi Menggunakan OpenID Connect di platform Apple

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Jika Anda telah mengupgrade ke Firebase Authentication dengan Identity Platform, Anda dapat mengautentikasi pengguna Anda dengan Firebase menggunakan penyedia yang sesuai dengan OpenID Connect (OIDC) pilihan Anda. Hal ini memungkinkan untuk menggunakan penyedia identitas yang tidak didukung secara native oleh Firebase.

Sebelum kamu memulai

Untuk memasukkan pengguna menggunakan penyedia OIDC, Anda harus terlebih dahulu mengumpulkan beberapa informasi dari penyedia:

  • ID Klien : String unik untuk penyedia yang mengidentifikasi aplikasi Anda. Penyedia Anda mungkin memberi Anda ID klien yang berbeda untuk setiap platform yang Anda dukung. Ini adalah salah satu nilai dari klaim aud dalam token ID yang dikeluarkan oleh penyedia Anda.

  • Rahasia klien : String rahasia yang digunakan penyedia untuk mengonfirmasi kepemilikan ID klien. Untuk setiap ID klien, Anda memerlukan rahasia klien yang cocok. (Nilai ini diperlukan hanya jika Anda menggunakan alur kode auth , yang sangat disarankan.)

  • Penerbit : String yang mengidentifikasi penyedia Anda. Nilai ini harus berupa URL yang, jika ditambahkan dengan /.well-known/openid-configuration , adalah lokasi dokumen penemuan OIDC penyedia. Misalnya, jika penerbitnya adalah https://auth.example.com , dokumen penemuan harus tersedia di https://auth.example.com/.well-known/openid-configuration .

Setelah Anda memiliki informasi di atas, aktifkan OpenID Connect sebagai penyedia masuk untuk proyek Firebase Anda:

  1. Tambahkan Firebase ke proyek iOS Anda .

  2. Jika Anda belum mengupgrade ke Firebase Authentication dengan Identity Platform, lakukanlah. Otentikasi OpenID Connect hanya tersedia di proyek yang ditingkatkan.

  3. Di laman Penyedia masuk di Firebase console, klik Tambahkan penyedia baru , lalu klik OpenID Connect .

  4. Pilih apakah Anda akan menggunakan aliran kode otorisasi atau aliran hibah implisit .

    Anda harus selalu menggunakan aliran kode jika penyedia Anda mendukungnya . Aliran implisit kurang aman dan penggunaannya sangat tidak disarankan.

  5. Beri nama untuk penyedia ini. Catat ID penyedia yang dihasilkan: sesuatu seperti oidc.example-provider . Anda akan memerlukan ID ini saat menambahkan kode masuk ke aplikasi Anda.

  6. Tentukan ID klien dan rahasia klien Anda, dan string penerbit penyedia Anda. Nilai-nilai ini harus sama persis dengan nilai yang diberikan penyedia Anda kepada Anda.

  7. Simpan perubahan Anda.

Tangani alur masuk dengan Firebase SDK

Cara termudah untuk mengautentikasi pengguna Anda dengan Firebase menggunakan penyedia OIDC Anda adalah dengan menangani seluruh alur masuk dengan Firebase SDK.

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

  1. Tambahkan skema URL khusus ke proyek Xcode Anda:

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

      Setelah selesai, konfigurasi Anda akan terlihat seperti berikut ini (tetapi dengan nilai khusus aplikasi Anda):

  2. Buat instance OAuthProvider menggunakan ID penyedia yang Anda dapatkan di Firebase console.

    Cepat

    var provider = OAuthProvider(providerID: "oidc.example-provider")
    

    Objective-C

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
    
  3. Opsional : Tentukan parameter OAuth khusus tambahan yang ingin Anda kirim dengan permintaan OAuth.

    Cepat

    provider.customParameters = [
      "login_hint": "user@example.com"
    ]
    

    Objective-C

    [provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
    

    Hubungi penyedia Anda untuk parameter yang didukungnya. 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 .

  4. Opsional : Tentukan cakupan OAuth 2.0 tambahan di luar profil dasar yang ingin Anda minta dari penyedia autentikasi.

    Cepat

    provider.scopes = ["mail.read", "calendars.read"]
    

    Objective-C

    [provider setScopes:@[@"mail.read", @"calendars.read"]];
    

    Hubungi penyedia Anda untuk cakupan yang didukungnya.

  5. Opsional : Jika Anda ingin menyesuaikan cara aplikasi menyajikan SFSafariViewController atau UIWebView saat menampilkan reCAPTCHA kepada pengguna, buat kelas khusus yang sesuai dengan protokol FIRAuthUIDelegate .

  6. Mengautentikasi dengan Firebase menggunakan objek penyedia OAuth.

    Cepat

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    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.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
      }
    }
    

    Objective-C

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    [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.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
      }
    }];
    
  7. Sementara contoh di atas berfokus pada alur masuk, Anda juga memiliki kemampuan untuk menautkan penyedia OIDC ke pengguna yang ada menggunakan linkWithCredential . Misalnya, Anda dapat menautkan beberapa penyedia ke pengguna yang sama yang memungkinkan mereka masuk dengan salah satunya.

    Cepat

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

    Objective-C

    [[FIRAuth auth].currentUser
        linkWithCredential:credential
                completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      if (error) {
        // Handle error.
      }
      // OIDC credential is linked to the current user.
      // IdP data available in authResult.additionalUserInfo.profile.
      // OAuth access token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)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.

    Cepat

    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 can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // OAuth ID token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.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 can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    

Tangani alur masuk secara manual

Jika Anda telah menerapkan alur masuk OpenID Connect di aplikasi, Anda dapat menggunakan token ID secara langsung untuk mengautentikasi dengan Firebase:

Cepat

let credential = OAuthProvider.credential(
    withProviderID: "oidc.example-provider",  // As registered in Firebase console.
    idToken: idToken,  // ID token from OpenID Connect flow.
    rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
    if error {
        // Handle error.
        return
    }
    // User is signed in.
    // IdP data available in authResult?.additionalUserInfo?.profile
}

Objective-C

FIROAuthCredential *credential =
    [FIROAuthProvider credentialWithProviderID:@"oidc.example-provider"  // As registered in Firebase console.
                                       IDToken:idToken  // ID token from OpenID Connect flow.
                                      rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
    if (error != nil) {
        // Handle error.
        return;
    }
    // User is signed in.
    // IdP data available in authResult.additionalUserInfo.profile
}];

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, Anda bisa mendapatkan informasi profil dasar pengguna dari objek FIRUser . 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: .

Cepat

    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;
}

Anda mungkin juga ingin menambahkan kode penanganan kesalahan untuk berbagai kesalahan otentikasi. Lihat Menangani Kesalahan .