Подтвердить что ты не робот

Есть ли безопасный способ управления ключами API?

Я использую API в своем приложении. В настоящее время я управляю ключом API из java-интерфейса

public interface APIContract {
    //The API KEY MUST NOT BE PUBLISH. It is possible to generate a new one for free from www.themoviedb.org
    //Remove before commit !!!
    String API_KEY = "abcdefghijklmnopqrstuvwxyz";
    /...
}

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

Итак, вот мой вопрос: можно ли переместить этот ключ в другое место, к которому я могу легко получить доступ из своего приложения, но которое не будет выполнено?

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

Кто-нибудь знает, как решить эту проблему? Я не нашел подобную проблему в stackoverflow, но, возможно, я что-то пропустил

ИЗМЕНИТЬ Мне нравится идея перемещать ключ вне любого Java-кода, потому что другие люди (возможно, не технические люди) могут легко управлять своим собственным ключом. Я думал об использовании файла gradle типа settings.gradle.

4b9b3361

Ответ 1

Вот еще один способ:

Поместите ключ API в файл, доступный для машины сборки/сервера, мы будем называть его:

/usr/api_user/api_key1

С содержимым:

myApiKey = abcdefghijklmnopqrstuvwxyz

Теперь вы получите доступ к нему с помощью объекта `BuildConfig 'gradle. Измените код следующим образом:

public interface APIContract {
    //The API KEY MUST NOT BE PUBLISH. It is possible to generate a new one for free from www.themoviedb.org
    //Remove before commit !!!
    String API_KEY = BuildConfig.MY_API_KEY;
    /...
}

Затем в вашем build.gradle добавьте что-то вроде этого:

buildConfigField "String", "MY_API_KEY", getMyApiKey("myApiKey")

А также добавьте это:

//return a MY API KEY from a properties file.
def getMyApiKey(String property){
    Properties properties = new Properties()
    properties.load(new FileInputStream("/usr/api_user/api_key1"))
    return "\"" + properties.getProperty(property) +"\""
}

Вы можете переместить местоположение каталога API, как вы можете сказать, чтобы он не был частью вашего репо. Конечно, тогда у него будут зависимости файловой системы для сборки..., которые вы могли бы настроить в среде CI/CD (возможно, такой инструмент, как Jenkins) для репликации файлов сборки в частное репо для целей резервного копирования.

Ответ 2

1. Храните ключи api в файле xml

Поместите xml файл "api_keys.xml" в каталог "res/values ​​/".

api_keys.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="THE_MOVIE_DB_API_TOKEN">XXXXX</string>
</resources>

использовать ключи api в java-коде

context.getString(R.string.THE_MOVIE_DB_API_TOKEN);

2. Храните ключи api с помощью gradle и gradle.properties файла

Пример_0 Пример_1

Добавьте следующую строку в [USER_HOME]/. gradle/ gradle.properties

Для ОС Windows, пример для пользователя Denis:

C:\Users\Denis\.gradle

gradle.properties

MyTheMovieDBApiToken="XXXXX"

Добавьте следующий код в файл build.gradle

build.gradle

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...
    }
    buildTypes {
        release {
            ...
        }
    }
    buildTypes.each {
      it.buildConfigField 'String', 'THE_MOVIE_DB_API_TOKEN', MyTheMovieDBApiToken
    }
}

использовать ключи api в java-коде

BuildConfig.THE_MOVIE_DB_API_TOKEN)

3. Храните ключи api с помощью gradle и переменной пути системы

Пример_0

Добавить новую переменную PATH системы THE_MOVIE_DB_API_TOKEN = "XXXXX":

Для ОС Windows:

  • открытая система
  • расширенные системные настройки
  • переменные среды
  • добавить переменные пользователя в переменные пользователя

Добавьте следующий код в файл build.gradle

build.gradle

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...
    }
    buildTypes {
        release {
            ...
        }
        buildTypes.each {
            it.buildConfigField 'String', 'THE_MOVIE_DB_API_TOKEN', "$System.env.THE_MOVIE_DB_API_TOKEN"
        }
    }
}

использовать ключи api в java-коде

BuildConfig.THE_MOVIE_DB_API_TOKEN)

Ссылка на мой смысл на github

Ответ 3

Вы можете добавить ключ в файл gradle.properties или передать его как аргумент