В соответствии с рекомендацией Google, необходимо ввести такие ограничения, как указание имени пакета, а также ключа SHA-1.
Это было объяснено здесь: https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key
Теперь проблема в том, что независимо от того, что вы делаете, ваш ключ API окажется в базе кода, т.е. если вы укажете его вне базы кода (через файл свойств), но передадите его через поле BuildConfig во время фазы сборки ( весь ключ виден кому-то, кто декомпилирует ваш код, поскольку он теперь является частью файла класса BuildConfig), или вы разбили его и сцепили в кодовой базе (разделенные ключи все еще видны, и любой может объединить их, увидев использование для получения окончательного ключа из распакованного apk).
Версия с разделенным ключом избавит от предупреждения в консоли воспроизведения, но ключ все еще открыт.
Мое предлагаемое решение, таким образом, состояло бы в том, чтобы закодировать ваш ключ API и передать его вокруг вашей кодовой базы. Непосредственно перед использованием вы декодируете его обратно.
Очень простой пример может быть:
Пожалуйста, используйте лучший алгоритм кодирования, а не это, это только для демонстрационных целей. Здесь мы используем кодировку Base64.
import android.util.Base64
fun main() {
// API Key = "123456ABC"
val myEncodedApiKey = "MTIzNDU2QUJD" // Should be passed via BuildConfig
val decodedApiKey = Base64.decode(myEncodedApiKey, Base64.DEFAULT)
// Now use `decodedApiKey` in your codebase.
val decodedApiKeyString = String(decodedApiKey)
}
Почему это лучше?
- Ваш ключ не такой, как в вашем проекте GCP.
- Консоль воспроизведения, когда она сканирует вашу кодовую базу, не может сопоставить ее с ключами API вашего проекта GCP. Таким образом, никаких предупреждений.
Обновление (пояснение по использованию файла google-services.json для ключа API):
Решение использовать ключ API из google-services.json не совсем корректно. google-services.json генерируется как правило, если вы подключаете свою учетную запись в firebase. Определенный там ключ API имеет другую модель ограничения. Тот, который вы определили в своем проекте GCP, отличается, позволяя передавать имя пакета и ключ SHA-1, а также ограничивается определенным видом доступа API, таким как доступ только на Youtube. Таким образом, если использовать ключи API из google-services.json, то вы практически не используете ограничения, установленные в вашей учетной записи GCP. Аккаунты GCP не генерируют файл google-services.json.
Для краткого обзора приведу официальный документ от Google по настройке API-интерфейса Youtube, который использует ключи API, определенные в проекте GCP, и в документах он упоминает о непосредственном введении ключей в код. (что в любом случае неправильно, так как оно разоблачено, но это Google для вас).
https://developers.google.com/youtube/android/player/setup
Нигде в любых документах не упоминается использование файла google-services.json для получения ключей API.