在 Google Play 商店控制台上传构建版本时出现错误。错误如下。
泄露的 GCP API 密钥 您的应用程序包含公开的 Google Cloud Platform (GCP) API 密钥。
罪魁祸首代码如下。
Places.initialize(getApplicationContext(), BuildConfig.GOOGLE_API_KEY);
根据文档,我正在从 BuildConfig 读取密钥并限制该密钥。但仍然是同样的问题。我该如何解决这个问题..
我也面临同样的问题。我找不到任何合适的解决方案。经过大量搜索后我找到了解决方案。所以我针对这个问题给出了一个完整的指南。 非常感谢 Prasenjit Banerjee 帮助我。
使用 API 密钥并避免泄露的 GCP API 密钥 Google Play 控制台中的安全问题的完整指南:
首先,您需要遵循 API 安全最佳实践 添加限制并安全地使用 API 密钥。
然后按照设置Android Studio项目将API密钥添加到
local.properties
并在AndroidManifest.xml
和主程序中使用它们。
最终访问 API 密钥作为
AndroidManifest.xml
文件中的变量:
<application>
.
.
.
.
<activity>
.
.
.
.
</activity>
<meta-data
android:name = "keyValue"
android:value = "${KEY}"/>
</application>
MainActivity.kt
中的API密钥并输入以下代码,从AndroidManifest.xml
中的元数据中获取KEY值(从GeeksforGeeks中的这篇文章中找到解决方案):
BuildConfig
类来获取这些 API 密钥,因为此类将这些属性公开为变量。class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//get the KEY value from the meta-data in AndroidManifest
val ai: ApplicationInfo = applicationContext.packageManager
.getApplicationInfo(applicationContext.packageName, PackageManager.GET_META_DATA)
val value = ai.metaData["keyValue"]
val key = value.toString()
//for testing only
Toast.makeText(applicationContext, key, Toast.LENGTH_LONG).show()
// use this key to initialize places sdk
Places.initialize(applicationContext, key)
}
}
为了保护您在 GCP 中的 API 密钥的安全,您必须在云平台控制台中搜索“凭据”。使用“创建凭据”按钮创建新的 API 密钥,其配置与受损的 API 密钥相同。 API Key 的限制必须匹配,否则您可能会遇到中断。
将 API Key 推送到所有使用过旧密钥的位置,然后删除旧密钥。
我建议您查看有关处理 GCP 中受损凭证的官方文档,以获取更详细的信息。
除此之外,您可能需要考虑无密钥 API 身份验证,通过 利用工作负载识别联合
您不应该直接从 BuildConfig 从本地属性获取 GCP 密钥。我通过使用此扩展函数从应用程序元数据获取密钥来修复它
fun Context.getKey(): String {
val applicationInfo = packageManager
.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
val keyValue = applicationInfo.metaData?.get("com.google.android.geo.API_KEY")
return keyValue.toString()
}
所以当你想拿到钥匙时你可以使用
Places.initialize(getApplicationContext(), requireContext().getKey());
Places.initialize(getApplicationContext(), this.getKey());
这个答案的内容基本上可以通过 gradle Secrets 插件获得,如文档中所述:https://developers.google.com/maps/documentation/android-sdk/secrets-gradle-plugin
此外,请记住,当您在预发布报告中收到有关公开 api 密钥的错误,或者在审核后看到警告时,您可以在执行文档中描述的步骤后忽略此警告(限制 API + gradle 插件秘密)。此警告不会消失,但不会阻止您发布应用程序。