Постепенно развертывайте проверку приложений Firebase с помощью Firebase Remote Config.

1. Введение

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

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

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

Один из способов получить больший контроль над развертыванием проверки приложений с помощью 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 в раздел «Платформы, библиотеки и встроенный контент» вашего приложения в Xcode. Пример того, как это сделать, можно найти в кодовой лаборатории Firebase App Check для платформ 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 Framework .

Добавьте следующий код в метод 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 будет создан позже в лаборатории кода). Если значение ложно, код завершается сбоем, что указывает на то, что проверка приложений не развернута на текущем устройстве. Если значение истинно, код пытается получить поставщика App Attest и терпит неудачу, если не может. Если эти проверки ошибок пройдены, код перенаправит запрос токена поставщику 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. Обновите класс фабрики поставщиков.

После того как вы реализовали логику для пересылки запроса токена поставщику App Attest и добавили несколько событий Analytics, вам необходимо обновить MyAppCheckProviderFactory.class , который вы создали в лаборатории кода App Check для платформ Apple . Этот класс будет нацелен на поставщика отладки 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
  }
}

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

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

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

  // ...
}

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

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

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

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

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

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

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

Определение условия удаленной настройки в консоли Firebase

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

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

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

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

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

Чтобы протестировать различные значения флага Remote Config на вашем устройстве без изменения кода приложения, настройте эксперимент с параметром AppAttestEnabled , следуя руководству «Создание экспериментов с удаленной конфигурацией Firebase с помощью 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.

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

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

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

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

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

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