Защитите облачные учетные данные вашего приложения Firebase ML для Android

Если ваше Android-приложение использует один из облачных API Firebase ML , перед запуском приложения в рабочую среду следует предпринять дополнительные шаги для предотвращения несанкционированного доступа к API.

Для ваших приложений, предназначенных для использования в производственной среде, необходимо обеспечить доступ к облачным сервисам только для аутентифицированных клиентов. (Обратите внимание, что аутентификация с помощью описанного метода возможна только для устройств без root-прав.)

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

1. Зарегистрируйте свои приложения в рабочей среде в Firebase.

Сначала зарегистрируйте свои приложения в рабочей среде в Firebase.

  1. Убедитесь, что у вас есть SHA-1-подписи вашего приложения. Инструкции по аутентификации клиента см. в разделе «Аутентификация клиента» .

  2. Перейдите в проекта в консоли Firebase , затем выберите вкладку «Настройки» .

  3. Прокрутите вниз до карточки «Ваши приложения» , затем выберите свое приложение для Android.

  4. Добавьте подпись SHA-1 вашего приложения в информацию о нем.

2. Ограничьте область действия ваших API-ключей.

Далее настройте существующие ключи API, чтобы запретить доступ к API Cloud Vision:

  1. Откройте страницу «Учетные данные» в консоли Google Cloud . При появлении запроса выберите свой проект.

  2. Для каждого существующего ключа API в списке откройте окно редактирования.

  3. В разделе «Ограничения API» выберите «Ограничить ключ» , затем добавьте в список все API, к которым вы хотите предоставить доступ с помощью ключа API. Убедитесь, что вы не включили API Cloud Vision.

    При настройке ограничений API для ключа API вы явно указываете API, к которым ключ имеет доступ. По умолчанию, если в разделе ограничений API выбран параметр «Не ограничивать ключ» , ключ API может использоваться для доступа к любому API, разрешенному для проекта.

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

Обратите внимание, что если вы в будущем включите какие-либо дополнительные API, вам необходимо будет добавить их в список ограничений API для соответствующего ключа API.

3. Создайте и используйте ключ API только для отладки.

Наконец, создайте новый ключ API, предназначенный исключительно для разработки. Firebase ML сможет использовать этот ключ API для доступа к сервисам Google Cloud в средах, где аутентификация приложения невозможна, например, при работе на эмуляторах.

  1. Создайте новый ключ API для использования в разработке:

    1. Откройте страницу «Учетные данные» в консоли Google Cloud . При появлении запроса выберите свой проект.

    2. Нажмите «Создать учетные данные» > «Ключ API» и запишите новый ключ API. Этот ключ позволяет приложениям без аутентификации получать доступ к API, поэтому храните его в секрете .

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

    1. Если у вас еще нет отладочного манифеста, создайте его, нажав Файл > Создать > Другое > Файл манифеста Android и выбрав debug из наборов целевых источников.

    2. В отладочный манифест добавьте следующее объявление:

      <application>
      <meta-data
          android:name="com.firebase.ml.cloud.ApiKeyForDebug"
          android:value="your-debug-api-key" />
      </application>
  3. В вашем приложении настройте Firebase ML так, чтобы для аутентификации клиента в производственной среде использовалось сопоставление отпечатков сертификатов, а для использования ключей API — ключа отладки — только в отладочных сборках:

    Kotlin

    val optionsBuilder = FirebaseVisionCloudImageLabelerOptions.Builder()
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch()
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f)
    // ...
    
    // And lastly:
    val options = optionsBuilder.build()
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage)

    Java

    FirebaseVisionCloudImageLabelerOptions.Builder optionsBuilder =
            new FirebaseVisionCloudImageLabelerOptions.Builder();
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch();
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f);
    // ...
    
    // And lastly:
    FirebaseVisionCloudImageLabelerOptions options = optionsBuilder.build();
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage);

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

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