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.
Вы также можете адаптировать шаги в этой кодовой лаборатории для тестирования собственного приложения.
Предпосылки
Что вам понадобится
- Xcode 12.5+
- Для тестирования App Attest:
- Учетная запись разработчика Apple, позволяющая создавать новые идентификаторы приложений.
- Приложение с явным идентификатором приложения с включенной функцией App Attest. См. статьи Регистрация идентификатора приложения и Включение возможностей приложения , если вам нужна помощь в этом процессе.
- Устройство iOS/iPadOS, поддерживающее App Attest
- Проект Firebase с:
- Настроено приложение для iOS ( узнать больше )
- Google Analytics , удаленная настройка и проверка приложений включены.
- Доступ к проекту Firebase, связанному с вашим приложением, с разрешениями на создание Remote Config и управление им, а также на просмотр Google Analytics.
2. Создайте собственного поставщика аттестации
На этом шаге мы создадим пользовательский класс поставщика, который будет предоставлять токен только при включенном App Attest. Remote Config опирается на настроенный экземпляр приложения Firebase, а настраиваемый поставщик, который вы реализуете на этом этапе, выступает в качестве заполнителя для завершения настройки.
Чтобы выполнить следующие шаги, вам нужно добавить Firebase
, FirebaseRemoteConfig
и FirebaseAnalytics
в раздел Frameworks, Libraries и Embedded Content вашего приложения в Xcode. Пример того, как это сделать, см. в лаборатории кода проверки приложений Firebase для платформ Apple .
- Создайте файл « MyAppCheckProvider », который является подклассом
NSObject
, соответствующим протоколуAppCheckProvider
. - Включите пустой метод
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:
- Откройте Remote Config для вашего проекта и нажмите Добавить параметр . Если вы впервые используете Remote Config, нажмите «Создать конфигурацию» .
- В поле Имя параметра (ключ) введите
AppAttestEnabled
. - В раскрывающемся списке Тип данных выберите Логический .
- В раскрывающемся списке Значение по умолчанию выберите false .
Прежде чем нажать Сохранить, создайте условное значение для 10% пользователей:
- Щелкните Добавить новое > Условное значение > Создать новое условие .
- В поле Имя введите название условия.
- В разделе Применяется, если... выберите Пользователь в случайном процентиле , <= , а затем введите 10 в поле % .
- Щелкните Создать условие .
Установите для условного значения значение true , чтобы приложение App Attest распространялось на 10 % ваших пользователей.
- Установите значение true для только что созданного условия.
- Нажмите Сохранить .
Когда вы закончите, опубликуйте изменения 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 .
Необязательно: используйте аудиторию Google Analytics.
Если вы хотите дополнительно использовать событие AppAttestEnabled Analytics, вы можете создать аудиторию Analytics для отслеживания пользователей с AppAttestEnabled , для которого задано значение true.
Приложение Attest было выпущено с iOS 14.0. Некоторые из ваших пользователей могут не использовать этот выпуск и, следовательно, не иметь права на аттестацию приложения. Вы можете зарегистрировать другое событие Analytics, чтобы отслеживать этих пользователей, а затем настроить таргетинг на эту аудиторию для другого метода аттестации, например DeviceCheck .
Необязательно: используйте Crashlytics для отслеживания сбоев.
Чтобы лучше понять стабильность вашего приложения во время развертывания, используйте Firebase Crashlytics для отслеживания сбоев и нефатальных ошибок.
6. Поздравляем!
Вы успешно развернули проверку приложений с помощью удаленной настройки 🎉