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.
Вы также можете адаптировать шаги, описанные в этой лаборатории кода, для тестирования собственного приложения.
Предварительные условия
Что вам понадобится
- Хкод 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
в раздел «Платформы, библиотеки и встроенный контент» вашего приложения в Xcode. Пример того, как это сделать, можно найти в кодовой лаборатории Firebase App Check для платформ 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 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:
- Откройте Remote Config для вашего проекта и нажмите « Добавить параметр» . Если вы впервые используете Remote Config, нажмите « Создать конфигурацию» .
- В поле Имя параметра (ключ) введите
AppAttestEnabled
. - В раскрывающемся списке Тип данных выберите Boolean .
- В раскрывающемся списке «Значение по умолчанию» выберите 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.
App Attest был выпущен в iOS 14.0. Некоторые из ваших пользователей могут не участвовать в этой версии и, следовательно, не иметь права на проверку приложения. Вы можете зарегистрировать другое событие Analytics, чтобы отслеживать этих пользователей, а затем нацелить эту аудиторию на другой метод аттестации, например DeviceCheck .
Необязательно: используйте Crashlytics для отслеживания сбоев.
Чтобы лучше понять стабильность вашего приложения во время развертывания, используйте Firebase Crashlytics для отслеживания сбоев и нефатальных ситуаций.
6. Поздравляем!
Вы успешно развернули проверку приложений с помощью Remote Config 🎉