Есть ли безопасный способ управления ключами 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
.
Ответы
Ответ 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 или передать его как аргумент