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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

1. Введение

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

Вы можете узнать больше о Firebase App Check в документации Firebase.

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

Что вы будете строить

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

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

  • Как добавить проверку приложений Firebase в существующее приложение.
  • Как установить разных поставщиков аттестации 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. Добавьте проверку приложений в свое приложение

  1. Подождите, пока диспетчер пакетов Swift разрешит зависимости проекта.
  2. Откройте вкладку Общие целевого приложения DatabaseExample (iOS) . Затем в разделе Frameworks, Libraries и Embedded Content нажмите кнопку + .
  3. Выберите, чтобы добавить FirebaseAppCheck .

4. Создайте и установите фабрику поставщиков проверки приложений.

  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

Чтобы использовать проверку приложений в своем проекте iOS, вам необходимо выполнить следующие действия в консоли Firebase:

  • Настройте проект Firebase.
  • Добавьте свое приложение для iOS в проект Firebase.
  • Настройте аутентификацию Firebase.
  • Инициализируйте экземпляр базы данных реального времени, который вы собираетесь защищать.
  • Настроить проверку приложений.

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

Во-первых, вам нужно создать проект Firebase.

  1. В консоли Firebase выберите Добавить проект .
  2. Назовите свой проект App Check Codelab
  3. Нажмите «Продолжить».
  4. Отключите Google Analytics для этого проекта и нажмите « Создать проект».

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

Теперь перейдите в раздел « База данных реального времени » консоли 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) и откройте вкладку Signing & Capabilities .
  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.

На этом шаге вы настроите проверку приложений для использования поставщика аттестации приложений в консоли Firebase.

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

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

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

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

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

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

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

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

Дополнительные сведения об этом рабочем процессе см. в статье Включение проверки приложений с помощью App Attest в iOS .

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

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

Установите поставщика отладки 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
  }
}

Этот подход дает нам больше гибкости для настройки проверки приложений в зависимости от среды. Например, вы можете использовать других поставщиков аттестации, таких как DeviceCheck , или настраиваемого поставщика аттестации в версиях ОС, где аттестация приложений недоступна. См. пример ниже:

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. Включите принудительную проверку приложений для базы данных Firebase Realtime.

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

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

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

64e6a81fa979b635.png

  1. Прочтите информацию в диалоговом окне подтверждения и нажмите Принудительно .

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

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

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

  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. Зарегистрируйте токен отладки в настройках проверки приложений вашего приложения в консоли Firebase.
  5. Перезапустите приложение.
  6. Вы больше не должны видеть сообщение об ошибке и сможете добавлять новые записи и комментарии в приложение.

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

9785d32f18b995d2.gif

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

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

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

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

Это другие ресурсы, которые могут оказаться полезными

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