1. Введение
Firebase App Check помогает защитить ваши внутренние ресурсы от злоупотреблений, таких как мошенничество с выставлением счетов и фишинг, гарантируя, что запросы поступают от легитимных приложений и устройств. Решение работает как с сервисами Firebase, так и с вашими внутренними сервисами, обеспечивая безопасность ваших ресурсов.
Дополнительную информацию о Firebase App Check можно найти в документации Firebase.
App Check использует платформенно-зависимые сервисы для проверки целостности приложения и/или устройства. Эти сервисы называются поставщиками аттестации . Одним из таких поставщиков является сервис App Attest от Apple, который App Check может использовать для проверки подлинности приложений и устройств Apple.
Что вы построите
В этой лабораторной работе вы добавите и примените проверку приложений в существующем примере приложения, чтобы защитить базу данных проекта в реальном времени от доступа со стороны нелегальных приложений и устройств.
Чему вы научитесь
- Как добавить Firebase App Check в существующее приложение.
- Как установить различных поставщиков аттестации Firebase App Check.
- Как настроить App Attest для вашего приложения.
- Как настроить поставщик аттестации отладки для тестирования вашего приложения на симуляторах во время разработки приложения.
Что вам понадобится
- Xcode 13.3.1 или более поздняя версия
- Учетная запись разработчика Apple, позволяющая создавать новые идентификаторы приложений.
- Устройство iOS/iPadOS, поддерживающее App Attest (подробнее о доступности API App Attest )
2. Получите стартовый проект
Репозиторий Firebase Quickstarts для iOS содержит примеры приложений для демонстрации различных продуктов Firebase. В качестве основы для этой практической работы вы будете использовать приложение Firebase Database Quickstart для SwiftUI.
Клонируйте репозиторий Firebase Quickstarts для iOS из командной строки:
git clone https://github.com/firebase/quickstart-ios.git cd quickstart-ios
Откройте проект приложения Realtime Database SwiftUI Quickstart в Xcode:
cd database/DatabaseExampleSwiftUI/DatabaseExample xed .
3. Добавьте проверку приложений в свое приложение
- Подождите, пока Swift Package Manager разрешит зависимости проекта.
- Откройте вкладку «Общие» в целевом приложении
DatabaseExample (iOS)
. Затем в разделе «Фреймворки, библиотеки и встроенное содержимое» нажмите кнопку «+» . - Выберите, чтобы добавить
FirebaseAppCheck
.
4. Создайте и установите фабрику поставщиков App Check.
- В группе
Shared
файлов добавьте новую группу с именемAppCheck
. - Внутри этой группы создайте класс фабрики в отдельном файле, например,
MyAppCheckProviderFactory.swift
, обязательно добавив его в цельDatabaseExample (iOS)
: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. return AppCheckDebugProvider(app: app) #else // Use App Attest provider on real devices. return AppAttestProvider(app: app) #endif } }
- Затем в
DatabaseExampleApp.swift
обязательно импортируйтеFirebaseAppCheck
и установите экземпляр классаMyAppCheckProviderFactory
в качестве фабрики поставщиков App Check.import SwiftUI import FirebaseCore import FirebaseAppCheck @main struct DatabaseExampleApp: App { init() { // Set an instance of MyAppCheckProviderFactory as an App Check // provider factory before configuring Firebase. AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory()) FirebaseApp.configure() } ... }
5. Создайте и настройте проект Firebase.
Чтобы использовать App Check в вашем проекте iOS, вам необходимо выполнить следующие шаги в консоли Firebase:
- Настройте проект Firebase.
- Добавьте свое iOS-приложение в проект Firebase.
- Настройте аутентификацию Firebase.
- Инициализируйте экземпляр Realtime Database, который вы собираетесь защитить.
- Настройте проверку приложений.
Создать проект
Для начала вам необходимо создать проект Firebase.
- Войдите в консоль Firebase, используя свою учетную запись Google.
- Нажмите кнопку, чтобы создать новый проект, а затем введите имя проекта (например,
App Check Codelab
). - Нажмите «Продолжить» .
- При появлении соответствующего запроса ознакомьтесь с условиями Firebase и примите их, а затем нажмите кнопку «Продолжить» .
- (Необязательно) Включите помощь ИИ в консоли Firebase (так называемая «Gemini в Firebase»).
- Для этой лабораторной работы вам не понадобится Google Analytics, поэтому отключите опцию Google Analytics.
- Нажмите «Создать проект» , дождитесь завершения подготовки проекта, а затем нажмите «Продолжить» .
Создать экземпляр базы данных в реальном времени
Теперь перейдите в раздел Realtime Database консоли Firebase.
- Нажмите кнопку «Создать базу данных» , чтобы начать рабочий процесс создания базы данных.
- Оставьте расположение базы данных по умолчанию (
us-central1
) без изменений и нажмите кнопку Далее . - Убедитесь, что выбран режим блокировки , и нажмите кнопку « Включить» , чтобы включить правила безопасности для вашей базы данных.
- Перейдите на вкладку «Правила» браузера Realtime Database и замените правила по умолчанию следующими:
{ "rules": { // User profiles are only readable/writable by the user who owns it "users": { "$UID": { ".read": "auth.uid == $UID", ".write": "auth.uid == $UID" } }, // Posts can be read by anyone but only written by logged-in users. "posts": { ".read": true, ".write": "auth.uid != null", "$POSTID": { // UID must match logged in user and is fixed once set "uid": { ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid" }, // User can only update own stars "stars": { "$UID": { ".validate": "auth.uid == $UID" } } } }, // User posts can be read by anyone but only written by the user that owns it, // and with a matching UID "user-posts": { ".read": true, "$UID": { "$POSTID": { ".write": "auth.uid == $UID", ".validate": "data.exists() || newData.child('uid').val() == auth.uid" } } }, // Comments can be read by anyone but only written by a logged in user "post-comments": { ".read": true, ".write": "auth.uid != null", "$POSTID": { "$COMMENTID": { // UID must match logged in user and is fixed once set "uid": { ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid" } } } } } }
- Нажмите кнопку «Опубликовать» , чтобы активировать обновленные правила безопасности.
Подготовьте свое iOS-приложение к подключению к Firebase
Чтобы запустить пример приложения на физическом устройстве, вам необходимо добавить проект в свою команду разработчиков, чтобы Xcode мог управлять необходимым профилем подготовки. Чтобы добавить пример приложения в свою учётную запись разработчика, выполните следующие действия:
- В Xcode выберите проект
DatabaseExample
в навигаторе проектов. - Выберите целевой объект
DatabaseExample (iOS)
и откройте вкладку «Подписание и возможности» . - Вы должны увидеть сообщение об ошибке: «Для подписи DatabaseExample (iOS) требуется группа разработчиков» .
- Обновите идентификатор пакета , указав уникальный идентификатор. Проще всего это сделать, используя обратное доменное имя вашего сайта, например,
com.acme.samples.firebase.quickstart.DatabaseExample
(не используйте этот идентификатор; вместо него выберите свой собственный уникальный идентификатор). - Выберите команду разработчиков.
- Вы поймете, что всё прошло успешно, когда Xcode отобразит надпись «Provisioning Profile: Xcode Managed Profile» и небольшой значок информации рядом с этой надписью. Щелкнув по этому значку, вы увидите более подробную информацию о профиле подготовки.
Подключите свое приложение iOS
Подробную информацию о подключении приложения см. в документации по добавлению Firebase в ваш проект iOS . Для начала выполните следующие основные шаги в консоли Firebase:
- На экране обзора проекта вашего нового проекта нажмите кнопку + Добавить приложение , а затем нажмите значок iOS+, чтобы добавить новое приложение iOS в ваш проект Firebase.
- Введите идентификатор пакета вашего приложения (используйте тот, который вы определили в предыдущем разделе, например,
com.acme.samples.firebase.quickstart.DatabaseExample
— помните, что это должен быть уникальный идентификатор) - Нажмите «Зарегистрировать приложение» .
- Firebase генерирует файл
GoogleService-Info.plist
содержащий все необходимые метаданные Firebase для вашего приложения. - Нажмите «Загрузить GoogleService-Info.plist» , чтобы загрузить файл.
- В Xcode вы увидите, что проект уже содержит файл
GoogleService-Info.plist
. Сначала удалите этот файл — на следующем шаге вы замените его файлом для своего проекта Firebase. - Скопируйте файл
GoogleService-Info.plist
, загруженный на предыдущем шаге, в корневую папку вашего проекта Xcode и добавьте его в цельDatabaseExample (iOS)
, убедившись, что он называетсяGoogleService-Info.plist
- Пройдите оставшиеся шаги процесса регистрации. Поскольку пример проекта уже настроен правильно, вам не нужно вносить никаких изменений в код.
Настройте аутентификацию Firebase
Уф! Пока что довольно много настроек, но держитесь крепче! Если вы новичок в Firebase, то вы уже познакомились с основными элементами рабочего процесса, с которыми скоро освоитесь.
Теперь вам нужно настроить аутентификацию Firebase для этого приложения.
Включить провайдер аутентификации по электронной почте/паролю
- Оставаясь в консоли Firebase , откройте раздел «Аутентификация» .
- Нажмите «Начать» , чтобы настроить аутентификацию Firebase для вашего проекта.
- Выберите вкладку «Способ входа» .
- В разделе «Поставщики» выберите «Электронная почта/Пароль» .
- Включите электронную почту/пароль и нажмите «Сохранить» .
Добавить тестового пользователя
- Откройте вкладку «Пользователи» в разделе «Аутентификация» .
- Нажмите Добавить пользователя .
- Укажите адрес электронной почты и пароль для тестового пользователя, затем нажмите Добавить пользователя .
Попробуйте приложение
Вернитесь в Xcode и запустите приложение в iOS Simulator. Войдите в систему, используя адрес электронной почты и пароль только что созданного тестового пользователя. После входа создайте публикацию, оставьте комментарий к существующей публикации, а также добавьте/снимите звёздочку с публикации.
6. Настройте поставщика подтверждения подлинности приложений.
На этом этапе вы настроите App Check для использования поставщика App Attest в консоли Firebase.
- В консоли Firebase перейдите в раздел «Проверка приложений ».
- Нажмите « Начать» .
- На вкладке «Приложения» нажмите на свое приложение, чтобы развернуть подробную информацию о нем.
- Нажмите «App Attest» , чтобы настроить App Attest, затем введите идентификатор команды вашей учетной записи разработчика Apple (его можно найти в разделе «Членство» на портале разработчиков Apple):
- Нажмите «Сохранить» .
После этого у вас появится рабочий проект Firebase, подключенный к нашему новому приложению, и функция App Check будет включена.
Теперь вы готовы настроить нашу службу аттестации! Подробнее об этом процессе см. в статье «Включение проверки приложений с помощью App Attest на iOS» .
7. Настройте App Attest для вашего приложения.
Теперь пришло время взять в руки Firebase App Check SDK и реализовать клиентский код.
Во-первых, вам необходимо настроить проект Xcode, чтобы SDK мог использовать API App Attest от Apple, чтобы гарантировать, что запросы, отправляемые из вашего приложения, поступают из легитимных экземпляров вашего приложения.
- Добавьте возможность App Attest для вашего целевого приложения в проект Xcode:
- откройте вкладку «Подписание и возможности» в настройках целевого приложения
- нажмите кнопку « + »
- в диалоговом окне найдите и выберите возможность App Attest
- После выполнения предыдущего шага в корневой папке вашего проекта Xcode появится файл
DatabaseExample (iOS).entitlements
- В файле
DatabaseExample (iOS).entitlements
измените значение ключаApp Attest Environment
наproduction.
После выполнения этих шагов и запуска приложения на физическом устройстве iOS (iPhone/iPad) у него по-прежнему будет доступ к базе данных Realtime. На следующем этапе вам нужно будет включить проверку приложений, которая будет блокировать запросы от нелегитимных приложений и устройств.
Дополнительную информацию об этом рабочем процессе см. в статье Включение проверки приложений с помощью App Attest на iOS .
8. Настройте поставщика подтверждения отладки для iOS Simulator.
Поставщик отладки Firebase App Check позволяет тестировать приложения с принудительной проверкой Firebase App Check в ненадежных средах, включая iOS Simulator, в процессе разработки. Далее необходимо настроить поставщик отладки.
Установите поставщик отладки Firebase в свое приложение
Вариант 1: Условное создание экземпляра поставщика отладки на вашей фабрике
Большую часть этого вы сделали при создании фабрики поставщиков App Check. На этом этапе вы добавите логирование локального секретного ключа отладки, сгенерированного поставщиком отладки, чтобы можно было зарегистрировать этот экземпляр приложения в консоли Firebase для отладки.
Обновите 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
// Use App Attest provider on real devices.
return AppAttestProvider(app: app)
#endif
}
}
Такой подход обеспечивает большую гибкость в настройке App Check в зависимости от среды. Например, вы можете использовать другие поставщики аттестации, такие как DeviceCheck , или собственного поставщика аттестации в версиях ОС, где App Attest недоступен. См. пример ниже:
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 App Attest provider on real devices.
return AppAttestProvider(app: app)
} else {
return DeviceCheckProvider(app: app)
}
#endif
}
}
Вариант 2: Установка AppCheckDebugProviderFactory
В более простых случаях вы можете временно или условно установить AppCheckDebugProviderFactory
перед настройкой экземпляра приложения Firebase:
init() {
#if targetEnvironment(simulator)
let providerFactory = AppCheckDebugProviderFactory()
#else
let providerFactory = MyAppCheckProviderFactory()
#endif
AppCheck.setAppCheckProviderFactory(providerFactory)
FirebaseApp.configure()
}
Это сэкономит вам пару строк кода на создание собственной фабрики поставщиков App Check.
Зарегистрируйте свой секрет отладки в консоли Firebase
Получите секрет отладки из вашего iOS-симулятора
- Если вы решили установить
AppCheckDebugProviderFactory
(вариант 2 выше), вам необходимо включить ведение журнала отладки для вашего приложения, добавив-FIRDebugEnabled
к аргументам запуска приложения: - Запустите свое приложение на симуляторе
- Найдите отладочный секрет в консоли Xcode. Вы можете использовать фильтр консоли, чтобы найти его быстрее:
Примечание: Отладочный секрет генерируется для вашего симулятора при первом запуске приложения и сохраняется в пользовательских настройках по умолчанию. При удалении приложения, сбросе настроек симулятора или использовании другого симулятора будет сгенерирован новый отладочный секрет. Обязательно зарегистрируйте новый отладочный секрет.
Зарегистрируйте отладочный секрет
- Вернитесь в консоль Firevbase и перейдите в раздел «Проверка приложений» .
- На вкладке «Приложения» нажмите на свое приложение, чтобы развернуть подробную информацию о нем.
- В дополнительном меню выберите Управление токенами отладки :
- Добавьте секрет, скопированный из консоли Xcode, и нажмите « Сохранить».
После этих шагов вы сможете использовать приложение на симуляторе даже при включенной проверке приложений.
Примечание: Поставщик отладки был специально разработан для предотвращения утечек отладочного секрета. При текущем подходе вам не нужно хранить отладочный секрет в исходном коде.
Более подробную информацию об этом процессе можно найти в документации — см. Использование проверки приложений с поставщиком отладки на iOS .
9. Включите принудительное выполнение проверки приложений для базы данных Firebase Realtime.
На данный момент наше приложение объявляет AppCheckProviderFactory
, который возвращает AppAttestProvider
для реальных устройств. При запуске на физическом устройстве ваше приложение выполнит аттестацию и отправит результаты в бэкенд Firebase. Однако бэкенд Firebase по-прежнему принимает запросы с любого устройства, симулятора iOS, скрипта и т. д. Этот режим полезен, когда у вас всё ещё есть пользователи со старой версией приложения без App Check, и вы пока не хотите принудительно проверять доступ.
Теперь вам нужно включить принудительное использование App Check, чтобы обеспечить доступ к приложению Firebase только с легальных устройств. Старые версии приложения без интеграции App Check перестанут работать после включения принудительного использования App Check для проекта Firebase.
- В консоли Firebase в разделе «Проверка приложений» нажмите «База данных реального времени» , чтобы развернуть подробную информацию.
- Нажмите Применить .
- Ознакомьтесь с информацией в диалоговом окне подтверждения, а затем нажмите кнопку Применить .
После выполнения этих шагов доступ к базе данных будет возможен только для легитимных приложений. Все остальные приложения будут заблокированы.
Попробуйте получить доступ к базе данных Realtime с помощью нелегитимного приложения.
Чтобы увидеть применение App Check в действии, выполните следующие действия:
- Отключите регистрацию App Check, закомментировав код регистрации App Check в методе
init
точки входа вашего приложения вDatabaseExampleApp
. - Сбросьте настройки симулятора, выбрав «Устройство» > «Стереть всё содержимое и настройки» . Это удалит данные симулятора (и сделает токен устройства недействительным).
- Запустите приложение еще раз на симуляторе.
- Теперь вы должны увидеть следующее сообщение об ошибке:
[FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server. Will not attempt reconnect. Reason: Invalid appcheck token.
Чтобы повторно включить проверку приложений, выполните следующие действия:
- Раскомментируйте код регистрации App Check в
DatabaseExampleApp
. - Перезапустите приложение.
- Обратите внимание на новый токен App Check в консоли Xcode.
- Зарегистрируйте токен отладки в настройках проверки приложений вашего приложения в консоли Firebase.
- Перезапустите приложение.
- Вы больше не увидите сообщение об ошибке и сможете добавлять новые сообщения и комментарии в приложение.
10. Поздравляем!
Теперь вы знаете, как:
- Добавить проверку приложений в существующий проект
- Настройте поставщика аттестации App Attest для рабочей версии вашего приложения.
- Настройте поставщика аттестации отладки для тестирования вашего приложения на симуляторе.
- Следите за выпуском версии приложения, чтобы знать, когда следует применять проверку приложений для вашего проекта Firebase.
- Включить принудительное выполнение проверки приложений
Следующие шаги
Узнайте, как использовать Remote Config для постепенного развертывания App Check для ваших пользователей в практической работе «Постепенное развертывание Firebase App Check с помощью Firebase Remote Config».
Вот другие ресурсы, которые могут оказаться вам полезными.
Настройка, описанная в этой лабораторной работе, подойдет для большинства случаев, но App Check обеспечивает большую гибкость при необходимости — для получения более подробной информации ознакомьтесь со следующими ссылками: