Melakukan Autentikasi Menggunakan Apple dan Unity

Anda dapat mengizinkan pengguna melakukan autentikasi dengan Firebase menggunakan ID Apple mereka dengan Firebase SDK untuk menjalankan alur login OAuth 2.0 secara menyeluruh.

Sebelum memulai

Agar pengguna dapat login menggunakan Apple, pertama-tama konfigurasikan Login dengan Apple di situs developer Apple, lalu aktifkan Apple sebagai penyedia login untuk project Firebase Anda.

Bergabunglah dengan Program Developer Apple

Login dengan Apple hanya dapat dikonfigurasi oleh anggota Program Developer Apple.

Mengonfigurasi Login dengan Apple

Login dengan Apple harus diaktifkan dan dikonfigurasi dengan benar di project Firebase Anda. Konfigurasi Apple Developer bervariasi di berbagai platform Android dan Apple. Pelajari bagian "Mengonfigurasi Login dengan Apple" di panduan iOS+ dan/atau Android sebelum melanjutkan.

Mengaktifkan Apple sebagai penyedia login

  1. Di Firebase console, buka bagian Authentication. Pada tab Sign-in method, aktifkan penyedia Apple.
  2. Konfigurasikan setelan penyedia Login dengan Apple:
    1. Jika Anda hanya men-deploy aplikasi di platform Apple, Anda dapat mengosongkan kolom Service ID, Apple Team ID, private key, dan key ID.
    2. Untuk dukungan di perangkat Android:
      1. Tambahkan Firebase ke project Android Anda. Pastikan untuk mendaftarkan tanda tangan SHA-1 aplikasi saat Anda menyiapkan aplikasi di Firebase console.
      2. Di Firebase console, buka bagian Authentication. Pada tab Sign in method, aktifkan penyedia Apple. Tentukan Service ID yang Anda buat di bagian sebelumnya. Selain itu, di bagian OAuth code flow configuration, masukkan Team ID Apple, kunci pribadi, dan ID kunci yang Anda buat di bagian sebelumnya.

Mematuhi persyaratan data anonim Apple

Login dengan Apple memungkinkan pengguna memilih opsi untuk membuat data miliknya anonim, termasuk alamat email, saat login. Pengguna yang memilih opsi ini memiliki alamat email dengan domain privaterelay.appleid.com. Jika menggunakan Login dengan Apple di aplikasi, Anda harus mematuhi kebijakan atau persyaratan developer yang berlaku dari Apple terkait ID Apple anonim ini.

Hal ini termasuk memperoleh persetujuan pengguna yang diperlukan sebelum Anda mengaitkan informasi identitas pribadi langsung apa pun dengan ID Apple anonim. Jika menggunakan Firebase Authentication, ini dapat meliputi tindakan-tindakan berikut:

  • Menautkan alamat email ke ID Apple anonim atau sebaliknya.
  • Menautkan nomor telepon ke ID Apple anonim atau sebaliknya.
  • Menautkan kredensial sosial non-anonim (Facebook, Google, dsb.) ke ID Apple anonim atau sebaliknya.

Daftar di atas tidak lengkap. Baca Apple Developer Program License Agreement di bagian Membership pada akun developer untuk memastikan aplikasi Anda memenuhi persyaratan Apple.

Mengakses class Firebase.Auth.FirebaseAuth

Class FirebaseAuth adalah gateway untuk semua panggilan API. Class ini dapat diakses melalui FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Menangani alur login dengan Firebase SDK

Proses Login dengan Apple bervariasi di berbagai platform Apple dan Android.

Di platform Apple

  1. Instal plugin pihak ketiga untuk menangani nonce login Apple dan pembuatan token, seperti Sign In With Apple Asset Storage Package dari Unity. Anda mungkin perlu mengubah kode untuk memetakan string nonce acak yang dihasilkan dalam status string mentahnya untuk digunakan dalam operasi Firebase (yaitu, menyimpan salinan nonce sebelum formulir ringkasan SHA256 nonce dibuat).

  2. Gunakan string token dan nonce mentah yang dihasilkan untuk membuat Kredensial Firebase, dan login ke Firebase.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

  3. Pola yang sama dapat digunakan dengan ReauthenticateAsync yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login terbaru. Untuk mengetahui informasi selengkapnya, baca bagian Mengelola Pengguna.

  4. Ketika melakukan penautan Login dengan Apple di platform Apple, Anda mungkin akan mengalami error bahwa akun Firebase yang ada telah ditautkan ke akun Apple. Jika hal ini terjadi, Firebase.Auth.FirebaseAccountLinkException akan ditampilkan, bukan Firebase.FirebaseException standar. Dalam hal ini, pengecualian menyertakan properti UserInfo.UpdatedCredential yang, jika valid, dapat digunakan untuk membantu pengguna yang tertaut ke Apple agar login melalui FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. Jika kredensial diperbarui, Anda tidak perlu membuat token Login dengan Apple yang baru dengan nonce untuk operasi login.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

Di Android

Pada Android, lakukan autentikasi pengguna dengan Firebase, dengan mengintegrasikan Login OAuth umum berbasis web ke dalam aplikasi Anda menggunakan Firebase SDK untuk melakukan alur login menyeluruh.

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

  1. Buat instance FederatedOAuthProviderData yang dikonfigurasi dengan ID penyedia yang sesuai untuk Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Opsional: Tentukan cakupan OAuth 2.0 tambahan di luar default yang ingin Anda minta dari penyedia autentikasi.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Opsional: Jika ingin menampilkan layar login Apple dalam bahasa selain bahasa Inggris, tetapkan locale parameter. Baca dokumentasi Login dengan Apple untuk lokalitas yang didukung.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. Setelah data penyedia Anda dikonfigurasi, gunakan data tersebut untuk membuat FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Lakukan autentikasi dengan Firebase menggunakan objek penyedia Auth. Perlu diperhatikan bahwa tidak seperti operasi FirebaseAuth lainnya, tindakan ini akan mengendalikan UI Anda dengan memunculkan tampilan web, tempat pengguna dapat memasukkan kredensial mereka.

    Untuk memulai alur login, panggil signInWithProvider:

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. Pola yang sama dapat digunakan dengan ReauthenticateWithProvider, yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login terbaru.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. Selain itu, Anda dapat menggunakan LinkWithCredentialAsync() untuk menautkan penyedia identitas yang berbeda ke akun yang ada.

    Perlu diperhatikan bahwa Apple mewajibkan Anda untuk mendapatkan persetujuan eksplisit dari pengguna sebelum Anda menautkan akun Apple mereka ke data lain.

    Misalnya, untuk menautkan akun Facebook ke akun Firebase saat ini, gunakan token akses yang Anda peroleh saat pengguna login ke Facebook:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.AuthResult result = task.Result;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Login dengan Apple Notes

Tidak seperti penyedia lain yang didukung oleh Firebase Auth, Apple tidak memberikan URL foto.

Selain itu, jika pengguna memilih untuk tidak membagikan email ke aplikasi, Apple akan menyediakan alamat email unik untuk pengguna tersebut (dengan format xyz@privaterelay.appleid.com), yang dibagikan ke aplikasi Anda. Jika Anda mengonfigurasi layanan relai email pribadi, Apple akan meneruskan email yang dikirim ke alamat anonim tersebut ke alamat email asli pengguna.

Apple hanya membagikan informasi pengguna seperti nama tampilan kepada aplikasi saat pengguna login untuk pertama kalinya. Biasanya, Firebase menyimpan nama tampilan saat pengguna login dengan Apple untuk pertama kalinya, yang dapat Anda peroleh dengan auth.CurrentUser.DisplayName. Namun, jika sebelumnya Anda menggunakan Apple untuk memproses login pengguna ke aplikasi tanpa menggunakan Firebase, Apple tidak akan memberikan nama tampilan pengguna ke Firebase.

Langkah berikutnya

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, Anda bisa mendapatkan informasi profil dasar pengguna dari objek Firebase.Auth.FirebaseUser. Baca bagian Mengelola Pengguna.

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