Melakukan Autentikasi Menggunakan Microsoft di iOS

Anda dapat mengizinkan pengguna untuk melakukan autentikasi dengan Firebase menggunakan penyedia OAuth, seperti Microsoft Azure Active Directory, dengan mengintegrasikan Login OAuth umum berbasis web ke aplikasi Anda menggunakan Firebase SDK untuk menjalankan alur login secara menyeluruh.

Sebelum Anda memulai

Untuk membuat pengguna agar login menggunakan akun Microsoft (akun Azure Active Directory dan akun Microsoft pribadi), Anda harus terlebih dahulu mengaktifkan Microsoft sebagai penyedia login untuk project Firebase:

  1. Menambahkan Firebase ke project iOS.
  2. Di Firebase console, buka bagian Auth.
  3. Pada tab Metode login, aktifkan penyedia Microsoft.
  4. Tambahkan Client ID dan Rahasia Klien dari konsol developer penyedia tersebut ke konfigurasi penyedia:
    1. Untuk mendaftarkan klien OAuth Microsoft, ikuti petunjuk di bagian Panduan Memulai: Mendaftarkan aplikasi dengan endpoint Azure Active Directory v2.0. Perlu diperhatikan bahwa endpoint ini mendukung login menggunakan akun pribadi Microsoft dan akun Azure Active Directory. Pelajari lebih lanjut Azure Active Directory v2.0.
    2. Saat mendaftarkan aplikasi dengan penyedia ini, pastikan untuk mendaftarkan domain *.firebaseapp.com untuk project Anda sebagai domain pengalihan untuk aplikasi Anda.
  5. Klik Simpan.

Memproses 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 client ID terbalik Anda. Untuk menemukan nilai ini, buka file konfigurasi GoogleService-Info.plist, lalu cari kunci REVERSED_CLIENT_ID. Salin nilai kunci tersebut, lalu tempel ke dalam kotak Skema URL di 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 microsoft.com.

    Swift

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

    Objective-C

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

    Swift

        provider.customParameters = [
          "prompt": "consent",
          "login_hint": "user@firstadd.onmicrosoft.com"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
        

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

    Untuk hanya mengizinkan pengguna dari tenant Azure AD tertentu agar dapat login ke aplikasi, nama domain yang cocok bagi tenant Azure AD atau ID GUID tenant dapat digunakan. Hal ini dapat dilakukan dengan menentukan kolom "tenant" di objek parameter kustom.

    Swift

        provider.customParameters = [
          // Optional "tenant" parameter in case you are using an Azure AD
          // tenant. eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or
          // 'contoso.onmicrosoft.com' or "common" for tenant-independent
          // tokens. The default value is "common".
          "tenant": "TENANT_ID"
        ]
        

    Objective-C

        // Optional "tenant" parameter in case you are using an Azure AD tenant.
        // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or
        // 'contoso.onmicrosoft.com' or "common" for tenant-independent tokens.
        // The default value is "common".
        provider.customParameters = @{@"tenant": @"TENANT_ID"};
        
  4. Opsional: Tentukan cakupan OAuth 2.0 tambahan di luar profil dasar yang ingin Anda minta dari penyedia autentikasi.

    Swift

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

    Objective-C

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

    Untuk mempelajari lebih lanjut, baca artikel mengenai dokumentasi izin dan persetujuan Microsoft.

  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

        // Replace nil with the custom class that conforms to AuthUIDelegate
        // you created in last step to use a customized web view.
        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.accessToken
              // OAuth ID token can also be retrieved:
              // 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.
              // OAuth access token can also be retrieved:
              // authResult.credential.accessToken
              // OAuth ID token can also be retrieved:
              // authResult.credential.idToken
            }];
          }
        }];
        

    Dengan menggunakan token akses OAuth, Anda dapat memanggil Microsoft Graph API.

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

    https://graph.microsoft.com/v1.0/me
    

    Tidak seperti penyedia lain yang didukung oleh Firebase Auth, Microsoft tidak menyediakan URL foto dan sebagai gantinya, data biner untuk foto profil harus diminta melalui Microsoft Graph API.

    Selain token akses OAuth, token ID OAuth pengguna juga dapat diambil dari objek OAuthCredential. Klaim sub dalam token ID adalah khusus aplikasi dan tidak akan cocok dengan ID pengguna gabungan yang digunakan oleh Firebase Auth dan dapat diakses melalui user.providerData[0].uid. Kolom klaim oid harus digunakan sebagai gantinya. Saat menggunakan tenant Azure AD untuk login, klaim oid akan menjadi sama persis. Namun, untuk kasus non-tenant, kolom oid akan diberi padding. Untuk ID gabungan 4b2eabcdefghijkl, oid akan memiliki formulir 00000000-0000-0000-4b2e-abcdefghijkl.

  7. Meskipun contoh di atas berfokus pada alur login, Anda juga dapat menautkan penyedia Microsoft ke pengguna yang ada menggunakan linkWithCredential. Misalnya, Anda dapat menautkan beberapa penyedia ke pengguna yang sama agar bisa login dengan salah satu penyedia tersebut.

    Swift

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

    Objective-C

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

Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan ditautkan 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, terlepas dari cara pengguna login.

  • Di aplikasi yang dimiliki, Anda bisa mendapatkan informasi profil dasar pengguna dari objek FIRUser. Baca bagian Mengelola Pengguna.

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

Anda dapat mengizinkan pengguna untuk login ke aplikasi menggunakan beberapa penyedia autentikasi dengan menautkan 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;
}

Anda juga dapat menambahkan kode penanganan error untuk berbagai error autentikasi. Baca artikel mengenai Menangani Error.