Luncurkan Firebase App Check secara bertahap menggunakan Firebase Remote Config

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

1. Perkenalan

Anda dapat menggunakan Firebase App Check dengan App Attest untuk melindungi layanan backend dan memverifikasi bahwa permintaan ke layanan Firebase berasal dari aplikasi asli Anda.

Biasanya disarankan untuk mengaktifkan pengguna secara bertahap ke layanan App Attest untuk menghindari batas kuota. Untuk informasi lebih lanjut, lihat dokumentasi Apple " Mempersiapkan Menggunakan Layanan Pengesahan Aplikasi ".

Kemampuan untuk merilis pembaruan aplikasi secara bertahap menggunakan fitur App Store Connect Apple, seperti yang dijelaskan dalam " Merilis pembaruan versi secara bertahap ," dapat membuat peluncuran App Check lebih lancar. Ini adalah solusi yang mudah dan sederhana. Namun, merilis pembaruan versi aplikasi secara bertahap tidak memungkinkan Anda mengontrol peluncuran atau mengubah perilaku aplikasi yang sudah ada dan diperbarui tanpa memublikasikan versi aplikasi baru.

Salah satu cara untuk memiliki kontrol lebih atas peluncuran App Check dengan App Attest adalah dengan menggunakan Firebase Remote Config untuk mengaktifkan App Check dengan App Attest untuk persentase pengguna aplikasi Anda dalam satu waktu. Ini dapat membantu menghindari pelambatan dari server pengesahan. Google Analytics dapat digunakan untuk mengamati dampak peluncuran terhadap pengguna.

Apa yang akan Anda pelajari

Dalam codelab multi-langkah ini, Anda akan mempelajari cara menggunakan Firebase Remote Config untuk meluncurkan App Check untuk aplikasi Anda.

Codelab ini menggunakan project Firebase berdasarkan aplikasi quickstart DatabaseExample dan terintegrasi dengan Firebase App Check, seperti yang dijelaskan dalam codelab Firebase App Check untuk Platform Apple . Aplikasi quickstart DatabaseExample memungkinkan pengguna untuk masuk dan menambahkan postingan menggunakan fitur Firebase Realtime Database.

Anda juga dapat menyesuaikan langkah-langkah dalam codelab ini untuk menguji aplikasi Anda sendiri.

Prasyarat

Apa yang Anda butuhkan

  • Xcode 12.5+
  • Untuk pengujian Pengesahan Aplikasi:
    • Akun Pengembang Apple yang memungkinkan Anda membuat pengidentifikasi aplikasi baru
    • Aplikasi dengan ID Aplikasi eksplisit dengan kemampuan Pengesahan Aplikasi diaktifkan. Lihat artikel Mendaftarkan ID Aplikasi dan Mengaktifkan kemampuan aplikasi jika Anda memerlukan bantuan untuk proses tersebut.
    • Perangkat iOS/iPadOS yang mendukung App Attest
  • Proyek Firebase dengan:
  • Akses ke project Firebase terkait aplikasi Anda, dengan izin untuk membuat dan mengelola Remote Config dan untuk melihat Google Analytics

2. Buat penyedia pengesahan khusus

Pada langkah ini, kita akan membuat class penyedia kustom untuk menyediakan token hanya saat App Attest diaktifkan. Remote Config bergantung pada instance aplikasi Firebase yang dikonfigurasi, dan penyedia kustom yang Anda implementasikan pada langkah ini bertindak sebagai placeholder untuk menyelesaikan konfigurasi.

Untuk menyelesaikan langkah-langkah berikut, Anda harus menambahkan Firebase , FirebaseRemoteConfig , dan FirebaseAnalytics di bagian Frameworks, Library, dan Embedded Content aplikasi Anda di Xcode. Untuk contoh cara melakukannya, lihat pemeriksaan Aplikasi Firebase untuk codelab platform Apple .

  1. Buat file " MyAppCheckProvider " yang merupakan subkelas NSObject yang sesuai dengan protokol AppCheckProvider .
  2. Sertakan metode getToken() kosong yang akan Anda isi nanti.

Lihat kode contoh berikut untuk kelas penyedia kustom dengan metode getToken() kosong.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

Untuk membuat instance AppAttestProvider , Anda harus meneruskan instance FirebaseApp yang sesuai. Buat properti tersimpan untuknya dan terima sebagai parameter penginisialisasi:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

Teruskan permintaan token ke penyedia App Attest

Sekarang Anda memiliki segalanya untuk meneruskan permintaan token ke penyedia App Attest dalam metode getToken() Anda.

Catatan: Pelajari lebih lanjut tentang metode getToken() di Referensi Kerangka Kerja FirebaseAppCheck .

Tambahkan kode berikut ke metode getToken() Anda:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
    // Fetch App Attest flag from Remote Config
    let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
    remoteConfig.fetchAndActivate { remoteConfigStatus, error in
      // Get App Attest flag value
      let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

      guard appAttestEnabled else {
        // Skip attestation if App Attest is disabled. Another attestation
        // method like DeviceCheck may be used instead of just skipping.
        handler(nil, MyProviderError.appAttestIsDisabled)
        return
      }

      // Try to obtain an App Attest provider instance and fail if cannot
      guard let appAttestProvider = self.appAttestProvider else {
        handler(nil, MyProviderError.appAttestIsUnavailable)
        return
      }

      // If App Attest is enabled for the app instance, then forward the
      // Firebase App Check token request to the App Attest provider
      appAttestProvider.getToken(completion: handler)
    }
  }
}

enum MyProviderError: Error {
  case appAttestIsDisabled
  case appAttestIsUnavailable
  case unexpected(code: Int)
}

Kode sebelumnya memeriksa parameter boolean Remote Config AppAttestEnabled (parameter Remote Config ini akan dibuat nanti di codelab). Jika nilainya salah, kode akan gagal, menunjukkan bahwa App Check tidak diluncurkan di perangkat saat ini. Jika nilainya benar, kode akan mencoba mendapatkan penyedia App Attest dan gagal jika tidak bisa. Jika pemeriksaan error ini lolos, kode akan meneruskan permintaan token ke penyedia App Attest.

Tambahkan peristiwa Analytics

Dengan menambahkan peristiwa Analytics, Anda mendapatkan wawasan yang lebih baik tentang seberapa sukses peluncuran App Check. Analytics akan membantu menentukan apakah Pengujian Aplikasi harus diaktifkan untuk audiens yang lebih besar.

Mencatat dua peristiwa Analytics: AppAttestSuccess saat berhasil, dan AppAttestFailure saat gagal. Kedua peristiwa Analytics ini dapat membantu melacak keberhasilan peluncuran App Check dan membantu Anda memutuskan apakah peluncuran yang lebih besar harus dilanjutkan.

func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
  // Fetch Remote Config.
  let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
  remoteConfig.fetchAndActivate { remoteConfigStatus, error in
    // Get App Attest flag value from Remote Config.
    let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

    guard appAttestEnabled else {
      // Skip attestation if App Attest is disabled. Another attestation
      // method like DeviceCheck may be used instead of just skipping.
      handler(nil, MyProviderError.appAttestIsDisabled)
      return
    }

    // Try to obtain an App Attest provider instance and fail otherwise.
    guard let appAttestProvider = self.appAttestProvider else {
      handler(nil, MyProviderError.appAttestIsUnavailable)
      return
    }

    // If App Attest is enabled for the app instance, then forward the
    // Firebase App Check token request to the App Attest provider.
    appAttestProvider.getToken { token, error in
      // Log an Analytics event to track attestation success rate.
      let appAttestEvent: String
      if (token != nil && error == nil) {
        appAttestEvent = "AppAttestSuccess"
      } else {
        appAttestEvent = "AppAttestFailure"
      }
      Analytics.logEvent(appAttestEvent, parameters: nil)

      // Pass the result to the handler
      handler(token, error)
    }
  }
}

3. Perbarui kelas Pabrik Penyedia

Setelah menerapkan logika untuk meneruskan permintaan token ke penyedia App Attest dan menambahkan beberapa peristiwa Analytics, Anda perlu mengupdate MyAppCheckProviderFactory.class yang Anda buat di codelab App Check for Apple Platforms . Kelas ini akan menargetkan penyedia debug App Check untuk simulator, dan sebaliknya menargetkan penyedia khusus Anda.

Edit kode berikut di kelas MyAppCheckProviderFactory yang Anda buat di codelab Firebase App Check untuk platform Apple :

// MyAppCheckProviderFactory.swift

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use your custom App Attest provider on real devices.
        return MyAppCheckProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

Konfirmasikan bahwa Anda telah menyetel AppCheckProviderFactory sebelum mengonfigurasi FirebaseApp :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. Tambahkan parameter Remote Config di Firebase console

Anda sekarang akan menambahkan parameter Remote Config AppAttestEnabled ke Firebase console . Metode getToken Anda memerlukan parameter ini.

Untuk membuat parameter Remote Config di Firebase console :

  1. Buka Remote Config untuk proyek Anda dan klik Tambahkan parameter . Jika ini pertama kalinya Anda menggunakan Remote Config, klik Buat konfigurasi .
  2. Di kolom Nama parameter (kunci) , masukkan AppAttestEnabled .
  3. Dari tarik-turun Jenis data , pilih Boolean .
  4. Dari drop-down Default value , pilih false .

Membuat Parameter Remote Config di Firebase console

Sebelum mengklik Simpan, buat nilai bersyarat untuk 10% pengguna:

  1. Klik Tambah baru > Nilai bersyarat > Buat ketentuan baru .
  2. Di bidang Nama , masukkan nama kondisi.
  3. Di bawah Applies if... , pilih User in random percentile , <= , lalu masukkan 10 di bidang % .
  4. Klik Buat ketentuan .

Menentukan kondisi Remote Config di Firebase console

Setel nilai bersyarat ke true sehingga App Attest akan diluncurkan ke 10% pengguna Anda.

  1. Setel nilai ke true untuk kondisi yang baru saja Anda buat.
  2. Klik Simpan .

Meninjau parameter Remote Config di Firebase console

Setelah selesai, publikasikan perubahan Remote Config.

Uji peluncuran di perangkat Anda

Untuk menguji berbagai nilai tanda Remote Config di perangkat Anda tanpa mengubah kode aplikasi, konfigurasikan eksperimen pada parameter AppAttestEnabled dengan mengikuti tutorial Membuat Eksperimen Konfigurasi Jarak Jauh Firebase dengan Pengujian A/B . Bagian tutorial " Memvalidasi eksperimen Anda pada perangkat pengujian " menjelaskan cara menetapkan nilai yang berbeda untuk perangkat pengujian Anda.

Langkah terakhir adalah menggunakan Google Analytics untuk memantau keberhasilan peluncuran App Attest Anda.

5. Tinjau keberhasilan peluncuran AppCheck Anda

Anda dapat mengukur keberhasilan peluncuran di dasbor Peristiwa Analytics. Perhatikan peristiwa AppAttestSuccess dan AppAttestFailure . Diperlukan waktu hingga 24 jam untuk melihat acara di dasbor. Alternatifnya, Anda dapat mengaktifkan debug dan menggunakan DebugView untuk melihat peristiwa debug dengan lebih cepat.

Secara opsional, Anda dapat memantau dasbor Crashlytics untuk peningkatan rasio error. Untuk informasi selengkapnya tentang menambahkan Crashlytics ke aplikasi Anda, lihat Memulai Firebase Crashlytics .

Setelah Anda melihat sebagian besar peristiwa AppAttestSuccess dan beberapa peristiwa AppAttestFailure , ada baiknya Anda meningkatkan persentase pengguna yang mengaktifkan App Attest dengan mengubah kondisi di parameter Remote Config AppAttestEnabled .

Meninjau peristiwa Analytics di konsol Firebase

Opsional: Manfaatkan Audiens Google Analytics

Jika ingin lebih memanfaatkan peristiwa AppAttestEnabled Analytics, Anda dapat membuat Audiens Analytics untuk melacak pengguna dengan AppAttestEnabled disetel ke true.

Pengesahan Aplikasi dirilis dengan iOS 14.0. Beberapa pengguna Anda mungkin tidak menggunakan rilis ini, sehingga tidak memenuhi syarat untuk Pengujian Aplikasi. Anda dapat mencatat peristiwa Analytics lainnya untuk melacak pengguna ini, lalu menargetkan audiens tersebut untuk metode pengesahan lainnya, seperti DeviceCheck .

Opsional: Gunakan Crashlytics untuk memantau error

Untuk lebih memahami stabilitas aplikasi Anda selama peluncuran, gunakan Firebase Crashlytics untuk memantau error dan non-fatal.

6. Selamat!

Anda berhasil meluncurkan App Check dengan Remote Config 🎉

Sumber daya tambahan: