Постепенно внедряйте Firebase App Check с помощью Firebase Remote Config.

1. Введение

Вы можете использовать Firebase App Check с App Attest, чтобы защитить свои серверные службы и убедиться, что запросы к службам Firebase поступают из вашего подлинного приложения.

Как правило, рекомендуется постепенно подключать пользователей к службе App Attest, чтобы избежать превышения квоты. Дополнительные сведения см. в документации Apple « Подготовка к использованию службы аттестации приложений ».

Возможность поэтапного выпуска обновлений приложений с помощью функции Apple App Store Connect, как описано в разделе «Поэтапный выпуск обновления версии », может сделать развертывание проверки приложений более плавным. Это прямое, простое решение. Однако поэтапный выпуск обновления версии приложения не позволяет контролировать развертывание или изменять поведение существующих обновленных приложений без публикации новой версии приложения.

Один из способов получить больший контроль над развертыванием проверки приложений с помощью App Attest — использовать Firebase Remote Config, чтобы включить проверку приложений с помощью App Attest для определенного процента пользователей вашего приложения за раз. Это может помочь избежать регулирования со стороны серверов аттестации. Google Analytics можно использовать для наблюдения за влиянием развертывания на пользователей.

Что вы узнаете

В этой многоэтапной лаборатории кода вы узнаете, как использовать Firebase Remote Config для развертывания проверки приложений для вашего приложения.

В этой лаборатории кода используется проект Firebase, основанный на приложении быстрого запуска DatabaseExample и интегрированный с Firebase App Check, как описано в лаборатории кода Firebase App Check для платформ Apple . Приложение быстрого запуска DatabaseExample позволяет пользователям входить в систему и добавлять сообщения, используя функции базы данных Firebase Realtime.

Вы также можете адаптировать шаги в этой кодовой лаборатории для тестирования собственного приложения.

Предпосылки

Что вам понадобится

2. Создайте собственного поставщика аттестации

На этом шаге мы создадим пользовательский класс поставщика, который будет предоставлять токен только при включенном App Attest. Remote Config опирается на настроенный экземпляр приложения Firebase, а настраиваемый поставщик, который вы реализуете на этом этапе, выступает в качестве заполнителя для завершения настройки.

Чтобы выполнить следующие шаги, вам нужно добавить Firebase , FirebaseRemoteConfig и FirebaseAnalytics в раздел Frameworks, Libraries и Embedded Content вашего приложения в Xcode. Пример того, как это сделать, см. в лаборатории кода проверки приложений Firebase для платформ Apple .

  1. Создайте файл « MyAppCheckProvider », который является подклассом NSObject , соответствующим протоколу AppCheckProvider .
  2. Включите пустой getToken() , который вы заполните позже.

См. следующий пример кода для пользовательского класса поставщика с пустым getToken() .

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

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

Чтобы создать экземпляр AppAttestProvider , вам нужно будет передать экземпляр соответствующего FirebaseApp . Создайте для него хранимое свойство и примите его как параметр инициализатора:

// 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) {}
}

Перенаправьте запрос токена поставщику App Attest.

Теперь у вас есть все, чтобы перенаправить запрос токена поставщику App Attest в getToken() .

Примечание. Узнайте больше о getToken() в справочнике по платформе FirebaseAppCheck .

Добавьте следующий код в метод getToken() :

// 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)
}

Предыдущий код проверяет логический параметр Remote Config AppAttestEnabled (этот параметр Remote Config будет создан позже в лаборатории кода). Если значение равно false, код завершается ошибкой, указывая на то, что проверка приложений не развернута на текущем устройстве. Если значение равно true, код пытается получить поставщика аттестации приложения и терпит неудачу, если не может. Если эти проверки ошибок пройдены, код перенаправит запрос токена поставщику App Attest.

Добавить события Аналитики

Добавляя события Analytics, вы получаете более полное представление об успешности развертывания проверки приложений. Аналитика поможет определить, следует ли включить App Attest для более широкой аудитории.

Зарегистрируйте два события Analytics: AppAttestSuccess в случае успеха и AppAttestFailure в случае сбоя. Эти два события Analytics могут помочь отследить успешность развертывания проверки приложений и решить, следует ли продолжать более крупное развертывание.

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. Обновите класс Provider Factory

После того, как вы внедрили логику для пересылки запроса токена поставщику App Attest и добавили некоторые события Analytics, вам необходимо обновить MyAppCheckProviderFactory.class , который вы создали в лаборатории кода App Check for Apple Platforms . Этот класс будет нацелен на поставщика отладки App Check для симуляторов, а в противном случае — на вашего собственного поставщика.

Отредактируйте следующий код в классе MyAppCheckProviderFactory , который вы создали в лаборатории кода Firebase App Check для платформ 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
  }
}

Перед настройкой FirebaseApp убедитесь, что вы установили AppCheckProviderFactory :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

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

  // ...
}

4. Добавьте параметр Remote Config в консоль Firebase.

Теперь вы добавите параметр удаленной конфигурации AppAttestEnabled в консоль Firebase. Для вашего метода getToken требуется этот параметр.

Чтобы создать параметр Remote Config в консоли Firebase:

  1. Откройте Remote Config для вашего проекта и нажмите Добавить параметр . Если вы впервые используете Remote Config, нажмите « Создать конфигурацию ».
  2. В поле Имя параметра (ключ) введите AppAttestEnabled .
  3. В раскрывающемся списке Тип данных выберите Логический .
  4. В раскрывающемся списке Значение по умолчанию выберите false .

Создание параметра удаленной конфигурации в консоли Firebase

Прежде чем нажать Сохранить, создайте условное значение для 10% пользователей:

  1. Щелкните Добавить новое > Условное значение > Создать новое условие .
  2. В поле Имя введите название условия.
  3. В разделе Применяется, если... выберите Пользователь в случайном процентиле , <= , а затем введите 10 в поле % .
  4. Щелкните Создать условие .

Определение условия Remote Config в консоли Firebase

Установите для условного значения значение true , чтобы приложение App Attest распространялось на 10 % ваших пользователей.

  1. Установите значение true для только что созданного условия.
  2. Нажмите Сохранить .

Просмотр параметра Remote Config в консоли Firebase

Когда вы закончите, опубликуйте изменения Remote Config.

Протестируйте развертывание на своем устройстве

Чтобы протестировать различные значения флага Remote Config на вашем устройстве без изменения кода приложения, настройте эксперимент для параметра AppAttestEnabled , следуя руководству по созданию экспериментов Firebase Remote Config с A/B-тестированием . В разделе руководства « Проверка эксперимента на тестовом устройстве » объясняется, как назначить различные значения для вашего тестового устройства.

Последним шагом является использование Google Analytics для отслеживания успеха вашего развертывания App Attest.

5. Проверьте успешность развертывания AppCheck.

Вы можете измерить успех развертывания на панели инструментов Analytics Events. Следите за событиями AppAttestSuccess и AppAttestFailure . Отображение событий на панели мониторинга может занять до 24 часов. Кроме того, вы можете включить отладку и использовать DebugView для более быстрого просмотра событий отладки.

При желании вы можете отслеживать увеличение количества сбоев на панели инструментов Crashlytics. Дополнительные сведения о добавлении Crashlytics в ваше приложение см. в разделе Начало работы с Firebase Crashlytics .

Когда вы видите в основном события AppAttestSuccess и несколько событий AppAttestFailure , это хороший признак того, что вы можете увеличить процент пользователей с включенным App Attest, изменив условие в параметре удаленной конфигурации AppAttestEnabled .

Просмотр событий Analytics в консоли Firebase

Необязательно: используйте аудиторию Google Analytics.

Если вы хотите дополнительно использовать событие AppAttestEnabled Analytics, вы можете создать аудиторию Analytics для отслеживания пользователей с AppAttestEnabled , для которого задано значение true.

Приложение Attest было выпущено с iOS 14.0. Некоторые из ваших пользователей могут не использовать этот выпуск и, следовательно, не иметь права на аттестацию приложения. Вы можете зарегистрировать другое событие Analytics, чтобы отслеживать этих пользователей, а затем настроить таргетинг на эту аудиторию для другого метода аттестации, например DeviceCheck .

Необязательно: используйте Crashlytics для отслеживания сбоев.

Чтобы лучше понять стабильность вашего приложения во время развертывания, используйте Firebase Crashlytics для отслеживания сбоев и нефатальных ошибок.

6. Поздравляем!

Вы успешно развернули проверку приложений с помощью удаленной настройки 🎉

Дополнительные ресурсы: