我真的需要找出如何保存 API 密钥以避免在公共存储库上暴露敏感密钥。
大多数在线教程建议使用
local.properties
文件来保存 API 密钥,但我在 local.properties
文件顶部看到免责声明 - 请勿修改此文件 - 您的更改将被删除!
我需要生成一个
buildConfigField
来访问主源代码上的密钥;这是我的 build.gradle
应用程序文件中的 Kotlin DSL 代码。
defaultConfig{ ...
val properties = Properties()
val apiKey: String
val localPropertiesFile = project.rootProject.file("gradle.properties")
apiKey = if (localPropertiesFile.exists()) {
properties.load(localPropertiesFile.inputStream())
properties.getProperty("API_KEY") ?: ""
} else {
System.getenv("API_KEY") ?: ""
}
buildConfigField(
"String",
"API_KEY",
"\"$apiKey\""
)
... }
关于使用
local.properties
保存 api 密钥文件的想法,docs 不同意:
注意:local.properties 文件是为特定属性保留的 到 Android Gradle 插件。将您自己的值放入此文件中可以 造成问题。如果您需要定义自己的本地属性, 创建一个单独的属性文件并手动加载它。
出于纯粹的好奇,我继续将密钥保存在 local.properties 文件中 - 应用程序构建得很好,但 buildConfigField 返回了一个 空字符串。
谁知道如何以安全推荐的方式解决这个问题?
不要将它们保存在 local.properties 中。正如您提到的,该文件可以被删除。另外,如果你在多个项目中都需要这样的键,你必须不断添加相同的值,这对于 CI 来说是没有用的。相反,请将它们添加到您的环境中并从那里读取它们。同样的方法在 CI 服务器(比如 jenkins)上也是有效的,而且会更安全一些。
从 gradle 读取环境值:
var auth = if(System.getenv("your_key")!=null){
println("api key is present!")
System.getenv("your_key")
} else {
println("api key is absent. Set it manually and make sure to not commit it.")
""
}