我在我的应用中使用API。我目前从java接口
管理API密钥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和公共存储库(我不想发布此密钥),这是不安全的。
所以这是我的问题:是否可以将此密钥移动到另一个我可以从我的应用程序轻松访问但不会被提交的地方?
我发现这个thread使用gradle存储密钥,但我需要提交build.gradle
文件,因此它不能完成工作。
有人知道如何解决这个问题吗?我没有在stackoverflow中发现类似的问题,但也许我错过了一些东西
修改
我喜欢在任何Java代码之外移动密钥的想法,因为其他人(可能是非技术人员)可以轻松管理自己的密钥。我正在考虑使用像settings.gradle
这样的gradle文件。
答案 0 :(得分:54)
将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>
在java代码中使用api密钥
context.getString(R.string.THE_MOVIE_DB_API_TOKEN);
将以下行添加到[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
}
}
在java代码中使用api密钥
BuildConfig.THE_MOVIE_DB_API_TOKEN)
添加新系统PATH变量 THE_MOVIE_DB_API_TOKEN =“XXXXX”:
将以下代码添加到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\""
}
}
}
在java代码中使用API密钥
BuildConfig.THE_MOVIE_DB_API_TOKEN
答案 1 :(得分:22)
这是另一种方式:
将API密钥放在构建机器/服务器可访问的文件中,我们将其称之为:
/usr/api_user/api_key1
内容:
myApiKey = abcdefghijklmnopqrstuvwxyz
现在您将使用`BuildConfig&#39;来访问它。 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)
您可以将密钥添加到gradle.properties文件中或将其作为参数传递
答案 3 :(得分:0)
我将它们放在开发计算机或ci服务器上的全局import this
import codecs
zen_of_python = codecs.encode(this.s, 'rot13')
文件中。这种方式不是项目的一部分,因此您不必担心在存储库中检查它,但是仍可以从gradle文件中轻松访问它。
例如,全局gradle.properties
文件应位于Mac上的gradle.properties
内部-顺便说一句,如果不存在,则应创建该文件。
然后,可以在您的 build.gradle 文件中引用这些属性,例如,使用与您在˜/.gradle
文件中使用的相同名称将它们公开为 buildConfigFields 。 / p>
gradle.properties
然后在Java / Kotlin代码上,您可以以buildConfigField 'String', 'API_KEY', maps.api.key
的身份访问它们