Проверка приложений Firebase для платформ Apple

1. Введение

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

Более подробную информацию о Firebase App Check можно найти в документации Firebase.

App Check использует платформенно-специфические сервисы для проверки целостности приложения и/или устройства. Эти сервисы называются поставщиками аттестации . Одним из таких поставщиков является сервис App Attest от Apple, который App Check может использовать для проверки подлинности приложений и устройств Apple.

Что вы построите

В этом практическом задании вы добавите и обеспечите проверку приложений (App Check) в существующее тестовое приложение, чтобы защитить базу данных реального времени проекта от доступа со стороны нелегальных приложений и устройств.

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

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

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

  • Xcode 13.3.1 или более поздняя версия
  • Учетная запись разработчика Apple, позволяющая создавать новые идентификаторы приложений.
  • Устройство iOS/iPadOS, поддерживающее App Attest (узнайте о доступности API App Attest ).

2. Получите стартовый проект.

В репозитории Firebase Quickstarts for iOS содержатся примеры приложений, демонстрирующие различные продукты Firebase. В качестве основы для этого практического занятия вы будете использовать приложение Firebase Database Quickstart для SwiftUI.

Клонируйте репозиторий Firebase Quickstarts for iOS из командной строки:

git clone https://github.com/firebase/quickstart-ios.git
cd quickstart-ios

Откройте проект приложения Realtime Database SwiftUI Quickstart в Xcode:

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. Добавьте функцию проверки приложений в ваше приложение.

  1. Дождитесь, пока Swift Package Manager разрешит зависимости проекта.
  2. Откройте вкладку «Общие» целевого приложения DatabaseExample (iOS) . Затем в разделе «Фреймворки, библиотеки и встроенный контент» нажмите кнопку «+» .
  3. Выберите этот пункт, чтобы добавить FirebaseAppCheck .

4. Создайте и установите фабрику поставщиков проверки приложений (App Check provider factory).

  1. В группе Shared файлы» добавьте новую группу с именем AppCheck .
  2. Внутри этой группы создайте класс-фабрику в отдельном файле, например, 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
      }
    }
    
  3. Далее, в DatabaseExampleApp.swift убедитесь, что импортировали FirebaseAppCheck , и установите экземпляр класса MyAppCheckProviderFactory в качестве фабрики поставщиков проверки приложений.
    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.
  • Инициализируйте экземпляр базы данных реального времени, который вы собираетесь защитить.
  • Настройка проверки приложения.

Создать проект

Для начала вам нужно создать проект Firebase.

  1. Войдите в консоль Firebase, используя свою учетную запись Google.
  2. Нажмите кнопку, чтобы создать новый проект, а затем введите название проекта (например, App Check Codelab ).
  3. Нажмите «Продолжить» .
  4. Если появится запрос, ознакомьтесь с условиями использования Firebase и примите их, после чего нажмите «Продолжить» .
  5. (Необязательно) Включите помощь ИИ в консоли Firebase (в Firebase она называется "Gemini").
  6. Для этого практического занятия вам не понадобится Google Analytics, поэтому отключите эту опцию.
  7. Нажмите «Создать проект» , дождитесь завершения подготовки проекта, а затем нажмите «Продолжить» .

Создайте экземпляр базы данных реального времени.

Теперь перейдите в раздел «База данных реального времени» в консоли Firebase.

  1. Нажмите кнопку «Создать базу данных» , чтобы запустить процесс создания базы данных.
  2. Оставьте местоположение базы данных по умолчанию ( us-central1 ) без изменений и нажмите «Далее» .
  3. Убедитесь, что выбран режим блокировки , и нажмите кнопку «Включить» , чтобы активировать правила безопасности для вашей базы данных.
  4. Перейдите на вкладку «Правила» в браузере базы данных реального времени и замените правила по умолчанию следующими:
    {
        "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"
                        }
                    }
                }
            }
        }
    }
    
  5. Нажмите кнопку «Опубликовать» , чтобы активировать обновленные правила безопасности.

Подготовьте ваше iOS-приложение к подключению к Firebase.

Чтобы запустить демонстрационное приложение на физическом устройстве, необходимо добавить проект в вашу команду разработчиков, чтобы Xcode мог управлять необходимым профилем подготовки. Выполните следующие шаги, чтобы добавить демонстрационное приложение в свою учетную запись разработчика:

  1. В Xcode выберите проект DatabaseExample в навигаторе проектов.
  2. Выберите целевой объект DatabaseExample (iOS) и откройте вкладку «Подписание и возможности» .
  3. Вы должны увидеть сообщение об ошибке: «Для подписи DatabaseExample (iOS) требуется команда разработчиков» .
  4. Обновите идентификатор пакета , заменив его уникальным. Проще всего это сделать, используя обратное доменное имя вашего веб-сайта, например, com.acme.samples.firebase.quickstart.DatabaseExample (пожалуйста, не используйте этот идентификатор; выберите вместо него свой собственный уникальный идентификатор).
  5. Выберите свою команду разработчиков.
  6. Вы поймете, что все прошло успешно, когда Xcode отобразит сообщение "Provisioning Profile: Xcode Managed Profile" и небольшой значок информации рядом с ним. Щелкнув по этому значку, вы увидите более подробную информацию о профиле подготовки.

Подключите ваше iOS-приложение

Для более подробного объяснения процесса подключения вашего приложения ознакомьтесь с документацией по добавлению Firebase в ваш iOS-проект . Для начала выполните следующие основные шаги в консоли Firebase:

  1. На экране обзора проекта вашего нового проекта нажмите кнопку «+ Добавить приложение» , а затем нажмите значок iOS+, чтобы добавить новое iOS-приложение в ваш проект Firebase.
  2. Введите идентификатор пакета вашего приложения (используйте тот, который вы определили в предыдущем разделе, например, com.acme.samples.firebase.quickstart.DatabaseExample — помните, что это должен быть уникальный идентификатор).
  3. Нажмите «Зарегистрировать приложение» .
  4. Firebase генерирует файл GoogleService-Info.plist , содержащий все необходимые метаданные Firebase для вашего приложения.
  5. Нажмите кнопку «Скачать GoogleService-Info.plist» , чтобы загрузить файл.
  6. В Xcode вы увидите, что проект уже содержит файл с именем GoogleService-Info.plist . Сначала удалите этот файл — на следующем шаге вы замените его файлом для вашего собственного проекта Firebase.
  7. Скопируйте файл GoogleService-Info.plist , который вы скачали на предыдущем шаге, в корневую папку вашего проекта Xcode и добавьте его в целевой объект DatabaseExample (iOS) , убедившись, что он называется GoogleService-Info.plist
  8. Пройдите оставшиеся этапы процесса регистрации. Поскольку пример проекта уже правильно настроен, вам не нужно вносить никаких изменений в код.

Настройка аутентификации Firebase

Уф! Пока что настройка довольно сложная, но подождите немного! Если вы новичок в Firebase, вы уже видели основные этапы рабочего процесса, с которыми скоро познакомитесь.

Теперь вам нужно настроить аутентификацию Firebase для этого приложения.

Включить аутентификацию по электронной почте/паролю. Поставщик авторизации.

  1. Оставаясь в консоли Firebase , откройте раздел «Аутентификация» .
  2. Нажмите « Начать» , чтобы настроить аутентификацию Firebase для вашего проекта.
  3. Выберите вкладку «Способ входа» .
  4. В разделе «Встроенные провайдеры» выберите «Электронная почта/Пароль» .
  5. Включите ввод адреса электронной почты и пароля и нажмите «Сохранить» .

Добавить тестового пользователя

  1. Откройте вкладку «Пользователи» в разделе «Аутентификация» .
  2. Нажмите «Добавить пользователя» .
  3. Укажите адрес электронной почты и пароль для тестового пользователя, затем нажмите «Добавить пользователя» .

Попробуйте приложение в деле!

Вернитесь в Xcode и запустите приложение на симуляторе iOS. Войдите в систему, используя адрес электронной почты и пароль созданного вами тестового пользователя. После входа в систему создайте пост, оставьте комментарий к существующему посту и поставьте/снимите отметку с поста.

6. Настройте поставщика аттестации App Attest.

На этом шаге вы настроите App Check для использования поставщика App Attest в консоли Firebase.

  1. В консоли Firebase перейдите в раздел «Проверка приложений ».
  2. Нажмите « Начать» .
  3. На вкладке «Приложения» щелкните по своему приложению, чтобы развернуть его подробную информацию.
  4. Нажмите «App Attest» , чтобы настроить App Attest, затем введите идентификатор команды вашей учетной записи разработчика Apple (его можно найти в разделе «Членство» на портале разработчиков Apple): 1645f7a369b678c2.png
  5. Нажмите « Сохранить ».

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

Теперь вы готовы настроить нашу специальную службу аттестации! Подробнее об этом процессе см. в разделе «Включение проверки приложений с помощью App Attest на iOS» .

7. Настройте App Attest для вашего приложения.

Теперь пришло время получить доступ к SDK Firebase App Check и реализовать клиентский код.

Во-первых, вам необходимо настроить проект Xcode таким образом, чтобы SDK мог использовать API Apple App Attest для обеспечения того, чтобы запросы, отправляемые из вашего приложения, поступали от легитимных экземпляров вашего приложения.

  1. Добавьте возможность проверки приложений (App Attest) для целевого объекта вашего приложения в проекте Xcode:
  2. Откройте вкладку «Подписание и возможности» в настройках целевого приложения.
  3. Нажмите кнопку " + ".
  4. В диалоговом окне найдите и выберите функцию «Аттестация приложения» . ae84cd988a5fab31.png
  5. После выполнения предыдущего шага в корневой папке вашего проекта Xcode появится файл DatabaseExample (iOS).entitlements .
  6. В файле DatabaseExample (iOS).entitlements измените значение ключа App Attest Environment на production.

После выполнения этих шагов и запуска приложения на физическом устройстве iOS (iPhone/iPad) приложение по-прежнему сможет получить доступ к базе данных в реальном времени. На следующем шаге вы включите проверку приложений (App Check), которая заблокирует запросы, отправляемые нелегальными приложениями и устройствами.

Чтобы узнать больше об этом рабочем процессе, см. раздел «Включение проверки приложений с помощью App Attest на iOS» .

8. Настройте поставщика аттестации отладки для симулятора iOS.

Отладчик Firebase App Check позволяет тестировать приложения с использованием Firebase App Check в ненадежных средах, включая симулятор iOS, в процессе разработки. Далее необходимо настроить отладчик.

Установите отладчик Firebase в свое приложение.

Вариант 1: Условно создайте экземпляр поставщика отладки в вашей фабрике.

Большую часть этого вы сделали при создании фабрики поставщиков проверки приложений. На этом шаге вы добавите логирование локального секрета отладки, сгенерированного поставщиком отладки, чтобы вы могли зарегистрировать этот экземпляр приложения в консоли 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()
}

Это позволит вам сэкономить несколько строк кода при создании собственной фабрики поставщиков проверок приложений.

Зарегистрируйте свой секретный ключ отладки в консоли Firebase.

Получите секретный ключ отладки из вашего iOS-симулятора.

  1. Если вы выбрали установку AppCheckDebugProviderFactory (вариант 2 выше), вам необходимо включить отладочное логирование для вашего приложения, добавив -FIRDebugEnabled к аргументам запуска приложения: f1c6b477a373e144.png
  2. Запустите свое приложение на симуляторе.
  3. Найдите секретный ключ отладки в консоли Xcode. Для более быстрого поиска можно использовать фильтр консоли: d4c65af93e369c55.png

Примечание: Секретный ключ отладки генерируется для вашего симулятора при первом запуске приложения и сохраняется в пользовательских настройках по умолчанию. Если вы удалите приложение, перезагрузите симулятор или используете другой симулятор, будет сгенерирован новый секретный ключ отладки. Обязательно зарегистрируйте новый секретный ключ отладки.

Зарегистрируйте секретный ключ отладки

  1. Вернувшись в консоль Firevbase, перейдите в раздел «Проверка приложений» .
  2. На вкладке «Приложения» щелкните по своему приложению, чтобы развернуть его подробную информацию.
  3. В дополнительном меню выберите «Управление отладочными токенами» : d77c8ff768a00b4b.png
  4. Добавьте секретный ключ, скопированный из консоли Xcode, а затем нажмите «Сохранить». f845c97b86f694d0.png

После выполнения этих шагов вы сможете использовать приложение в симуляторе, даже если функция проверки приложений включена.

Примечание: Поставщик отладочной информации был специально разработан для предотвращения утечек секретного ключа отладки. При текущем подходе вам не нужно хранить секретный ключ отладки в исходном коде.

Более подробную информацию об этом процессе можно найти в документации — см. раздел «Использование проверки приложений с помощью отладчика на iOS» .

9. Включите проверку приложений (App Check) для базы данных Firebase Realtime Database.

На данный момент наше приложение объявляет AppCheckProviderFactory , который возвращает AppAttestProvider для реальных устройств. При запуске на физическом устройстве ваше приложение выполнит аттестацию и отправит результаты в бэкэнд Firebase. Однако бэкэнд Firebase по-прежнему принимает запросы с любого устройства, симулятора iOS, скрипта и т. д. Этот режим полезен, если у вас все еще есть пользователи со старой версией вашего приложения без App Check, и вы пока не хотите принудительно проверять доступ.

Теперь необходимо включить проверку приложений App Check, чтобы гарантировать доступ к приложению Firebase только с легитимных устройств. Старые версии приложения без интеграции с App Check перестанут работать после включения проверки приложений App Check для проекта Firebase.

  1. В консоли Firebase в разделе «Проверка приложений» щелкните «База данных реального времени» , чтобы развернуть ее подробные сведения.
  2. Нажмите «Применить» .

64e6a81fa979b635.png

  1. Ознакомьтесь с информацией в диалоговом окне подтверждения, а затем нажмите «Применить» .

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

Попробуйте получить доступ к базе данных в режиме реального времени с помощью нелегального приложения.

Чтобы увидеть, как работает система проверки приложений App Check, выполните следующие шаги:

  1. Отключите регистрацию App Check, закомментировав код регистрации App Check в методе init точки входа вашего приложения в DatabaseExampleApp .
  2. Чтобы сбросить настройки симулятора, выберите «Устройство» > «Стереть все содержимое и настройки» . Это приведет к удалению всех данных с симулятора (и аннулированию токена устройства).
  3. Запустите приложение еще раз в симуляторе.
  4. Теперь вы должны увидеть следующее сообщение об ошибке:
    [FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server.  Will not attempt reconnect. Reason: Invalid appcheck token.
    

Чтобы повторно включить проверку приложений, выполните следующие действия:

  1. Раскомментируйте код регистрации приложения App Check в DatabaseExampleApp .
  2. Перезапустите приложение.
  3. Обратите внимание на новый токен проверки приложения в консоли Xcode.
  4. Зарегистрируйте отладочный токен в настройках App Check вашего приложения в консоли Firebase.
  5. Перезапустите приложение.
  6. Сообщение об ошибке больше не должно появляться, и вы сможете добавлять новые публикации и комментарии в приложение.

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

9785d32f18b995d2.gif

Теперь вы знаете, как:

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

Следующие шаги

Узнайте, как использовать Remote Config для постепенного развертывания проверки приложений Firebase App Check для ваших пользователей в практическом занятии «Постепенное развертывание проверки приложений Firebase с помощью Firebase Remote Config».

Вот еще несколько ресурсов, которые могут вам пригодиться.

Описанная в этом практическом задании конфигурация подойдет для большинства случаев, но App Check предоставляет большую гибкость при необходимости — подробнее см. по следующим ссылкам: