Как защитить Navigation SDK для iOS с помощью App Check

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

Зачем использовать проверку приложений?

App Check защищает две области Navigation SDK для iOS: основную функцию навигации и функцию отправки отчетов о нарушениях.

Проверка приложений помогает блокировать основные запросы Navigation SDK для iOS из вредоносных или неавторизованных источников. Это защищает ваш проект от мошеннического списания средств и исчерпания квот.

Сообщения о сбоях

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

Почему App Check важен для отчетов

  • Высокий уровень доверия для перекрытых участков. События, влияющие на маршрут, например перекрытые участки дорог, могут значительно изменить прокладку маршрута для всех водителей. Чтобы защитить карты от вандализма, спама и неточных сообщений, инфраструктура модерации Google для сообщений о перекрытии дорог опирается на надежные сигналы целостности устройства и приложения.
  • Как App Check проверяет жалобы. Жалобы и голоса, отправленные из Navigation SDK для iOS, содержат токен App Check. Он используется на сервере Google, чтобы проверить подлинность отзыва, повысить его уровень доверия и оценить его влияние на карты.
  • Последствия отсутствия App Check. Отчеты, отправленные без действительного токена App Check, оцениваются по модели с более низким уровнем доверия и могут обрабатываться только как скрытые сигналы. Это значит, что пользователи по-прежнему могут отправлять сообщения и голосовать, но их сообщения с меньшей вероятностью будут видны на карте или повлияют на маршруты других водителей и потребуют дополнительной проверки.

Подходит ли мне App Check?

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

  • Частные или экспериментальные приложения. Если ваше приложение недоступно широкой публике, проверка приложений не требуется.
  • Взломанные устройства. Рекомендуемые поставщики аттестации не позволяют Navigation SDK для iOS работать на ненадежных устройствах, например на телефонах с root-доступом или незаконно разблокированных устройствах. Чтобы поддерживать эти устройства, разверните поставщика подтверждения.

Обзор этапов реализации

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

  1. Добавьте Firebase в приложение.
  2. Добавьте библиотеку App Check и инициализируйте App Check.
  3. Добавьте поставщика токенов. На этом этапе вызывается выбранный вами поставщик аттестации, чтобы проверить целостность устройства или приложения.
  4. Инициализируйте API навигации и проверки приложений.
  5. Включите отладку. Это полезно при разработке или в средах непрерывной интеграции.
  6. Прежде чем включить принудительное применение, отслеживайте запросы в приложении. Это позволит вам внедрить Проверку приложений, не мешая пользователям.

Что нужно учитывать при планировании интеграции App Check

  • Квоты поставщиков аттестации. На рекомендуемых нами поставщиков аттестации, DeviceCheck и App Attest, распространяются квоты и ограничения, установленные Apple.
  • Задержка при запуске. В большинстве случаев пользователи не сталкиваются с задержками при обычном использовании, поскольку токены App Check кешируются на устройстве. Система автоматически обновляет токены App Check в фоновом режиме до истечения срока их действия, чтобы обеспечить бесперебойную работу. Однако если действительный токен App Check отсутствует, при запуске приложения может наблюдаться некоторая задержка. Например, задержка возникает при холодном запуске, когда срок действия токена в кеше истек или токен отсутствует.
  • Время жизни токена (TTL). Время жизни (TTL) определяет, сколько времени действителен токен Проверки приложений, прежде чем его нужно будет обновить. Вы можете задать в консоли Firebase продолжительность от 30 минут до 7 дней. Рекомендуется установить значение 1 час в качестве безопасного базового уровня, но SDK автоматически пытается обновить данные в фоновом режиме примерно через половину времени жизни TTL. Пошаговые инструкции по работе с консолью приведены в документации по проверке приложений Firebase.

Как интегрировать в приложение проверку приложений

Требования

  • Приложение с Navigation SDK для iOS версии 11.0 или более поздней.
  • Идентификатор пакета приложения.
  • Идентификатор команды на вкладке Membership (Членство) в консоли разработчика Apple.
  • Если вы планируете использовать DeviceCheck, вам понадобятся файл закрытого ключа и идентификатор ключа.
  • Вы должны быть владельцем приложения в консоли Google Cloud.
  • Идентификатор проекта приложения из консоли Google Cloud.

Шаг 1. Добавьте Firebase в приложение

Следуйте инструкциям в документации для разработчиков Firebase, чтобы добавить Firebase в приложение. Добавьте файл GoogleService-Info.plist без изменений в корневой каталог проекта.

Импортируйте в файл AppDelegate следующие модули:

Swift

import FirebaseCore
import FirebaseAppCheck
import GoogleNavigation

Objective-C

@import FirebaseCore;
@import FirebaseAppCheck;
@import GoogleNavigation;

Шаг 2. Добавьте библиотеку App Check и инициализируйте App Check

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

  1. Следуйте инструкциям Firebase, чтобы добавить библиотеку проверки приложений:
  2. Инициализируйте App Check в AppDelegate:
    • Если вы используете App Attest, создайте реализацию AppCheckProviderFactory и зарегистрируйте ее перед вызовом FirebaseApp.configure():

      Swift

      class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
          func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
              return AppAttestProvider(app: app)
          }
      }
      // In application(_:didFinishLaunchingWithOptions:)
      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()

      Objective-C

      #import <FirebaseCore/FirebaseCore.h>
      #import <FirebaseAppCheck/FirebaseAppCheck.h>
      
      @interface YourAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
      @end
      
      @implementation YourAppCheckProviderFactory
      - (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp *)app {
          return [[FIRAppAttestProvider alloc] initWithApp:app];
      }
      @end
      
      // In application:didFinishLaunchingWithOptions:
      YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
      [FIRApp configure];
    • Если вы используете DeviceCheck, настройте фабрику следующим образом:

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      FIRDeviceCheckProviderFactory *providerFactory = [[FIRDeviceCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];

Шаг 3. Добавьте поставщика токенов

Создайте файл с названием AppCheckTokenProvider (или, если вы используете Objective-C, два файла с названиями AppCheckTokenProvider.h и AppCheckTokenProvider.m) в корневом каталоге приложения.

Этот класс должен соответствовать протоколу GMSAppCheckTokenProvider и реализовывать метод fetchAppCheckTokenWithCompletion.

Swift

import Foundation
import FirebaseAppCheck
import GoogleNavigation

class AppCheckTokenProvider: NSObject, GMSAppCheckTokenProvider {
    func fetchAppCheckToken(completion: @escaping (String?, Error?) -> Void) {
        AppCheck.appCheck().token(forcingRefresh: false) { token, error in
            if let error = error {
                print("App Check Error: \(error)")
                completion(nil, error)
                return
            }
            guard let token = token else {
                completion(nil, NSError(domain: "AppCheck", code: -1, userInfo: [NSLocalizedDescriptionKey: "Token is nil"]))
                return
            }
            print("App Check Token: \(token.token)")
            completion(token.token, nil)
        }
    }
}

Objective-C

// AppCheckTokenProvider.h
#import <Foundation/Foundation.h>
#import <GoogleNavigation/GoogleNavigation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppCheckTokenProvider : NSObject <GMSAppCheckTokenProvider>
@end

NS_ASSUME_NONNULL_END
// AppCheckTokenProvider.m
#import "AppCheckTokenProvider.h"
#import <FirebaseAppCheck/FirebaseAppCheck.h>

@implementation AppCheckTokenProvider
- (void)fetchAppCheckTokenWithCompletion:(void (^)(NSString * _Nullable token, NSError * _Nullable error))completion {
    [[FIRAppCheck appCheck] tokenForcingRefresh:NO
                                     completion:^(FIRAppCheckToken * _Nullable token, NSError * _Nullable error) {
        if (token) {
            completion(token.token, nil);
        } else {
            completion(nil, error);
        }
    }];
}
@end

Шаг 4. Инициализируйте API навигации и App Check

Инициализируйте Navigation SDK для iOS и зарегистрируйте экземпляр поставщика токенов на GMSServices:

Swift

// In application(_:didFinishLaunchingWithOptions:)
GMSServices.provideAPIKey("YOUR_API_KEY")

// Register your App Check token provider before initializing Navigation SDK for iOS
GMSServices.appCheckTokenProvider = AppCheckTokenProvider()

Objective-C

// In application:didFinishLaunchingWithOptions:
[GMSServices provideAPIKey:@"YOUR_API_KEY"];

// Register your App Check token provider before initializing Navigation SDK for iOS
GMSServices.appCheckTokenProvider = [[AppCheckTokenProvider alloc] init];

Шаг 5. Включите отладку (необязательно)

После того как для Navigation SDK для iOS будет включена проверка приложений, функции вашего приложения, зависящие от Navigation SDK для iOS, не будут работать в симуляторе или в среде непрерывной интеграции (CI), поскольку эти среды не считаются действительными устройствами. Чтобы запустить приложение в этих средах во время разработки и тестирования, вам необходимо создать отладочную сборку приложения, которая использует отладочный поставщик App Check вместо поставщика аттестации рабочей версии.

  1. Настройте фабрику отладочных поставщиков в файле AppDelegate:

    Swift

    #if targetEnvironment(simulator)
    let providerFactory = AppCheckDebugProviderFactory()
    #else
    let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)

    Objective-C

    #if TARGET_OS_SIMULATOR
    id<FIRAppCheckProviderFactory> providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init];
    #else
    id<FIRAppCheckProviderFactory> providerFactory = [[YourAppCheckProviderFactory alloc] init];
    #endif
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
  2. Включите ведение журнала в проекте Xcode, запустите приложение и найдите локальный токен отладки в журнале консоли.
  3. Скопируйте и добавьте этот токен отладки в консоль Firebase. Подробную информацию можно найти в документации по отладочному поставщику Проверки приложений Firebase.

Шаг 6. Отслеживайте запросы приложения и принимайте меры

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

  1. Чтобы посмотреть процент подтвержденного и неподтвержденного трафика, перейдите на экран показателей Проверки приложений в консоли Firebase.
  2. Когда вы убедитесь, что большая часть трафика проверена и пользователи обновили приложение до версии с реализацией App Check, включите принудительное применение.
  3. После этого App Check будет отклонять весь трафик без действительного токена.