(GCP) API 密钥。您的应用程序包含公开的 Google Cloud Platform (GCP) API 密钥

问题描述 投票:0回答:4

在 Google Play 商店控制台上传构建版本时出现错误。错误如下。

泄露的 GCP API 密钥 您的应用程序包含公开的 Google Cloud Platform (GCP) API 密钥。

罪魁祸首代码如下。

Places.initialize(getApplicationContext(), BuildConfig.GOOGLE_API_KEY);

根据文档,我正在从 BuildConfig 读取密钥并限制该密钥。但仍然是同样的问题。我该如何解决这个问题..

google-cloud-platform google-play-console android-security
4个回答
21
投票

我也面临同样的问题。我找不到任何合适的解决方案。经过大量搜索后我找到了解决方案。所以我针对这个问题给出了一个完整的指南。 非常感谢 Prasenjit Banerjee 帮助我。

使用 API 密钥并避免泄露的 GCP API 密钥 Google Play 控制台中的安全问题的完整指南:

  1. 首先,您需要遵循 API 安全最佳实践 添加限制并安全地使用 API 密钥。

  2. 然后按照设置Android Studio项目将API密钥添加到

    local.properties
    并在
    AndroidManifest.xml
    和主程序中使用它们。

  3. 最终访问 API 密钥作为

    AndroidManifest.xml
    文件中的变量:

<application>
        .
        .
        .
        .        
        <activity>
            .
            .
            .
            .
        </activity>
  
    <meta-data
        android:name = "keyValue"
        android:value = "${KEY}"/>
      
</application>
  1. 访问
    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)
    }
}

1
投票

为了保护您在 GCP 中的 API 密钥的安全,您必须在云平台控制台中搜索“凭据”。使用“创建凭据”按钮创建新的 API 密钥,其配置与受损的 API 密钥相同。 API Key 的限制必须匹配,否则您可能会遇到中断。

将 API Key 推送到所有使用过旧密钥的位置,然后删除旧密钥。


我建议您查看有关处理 GCP 中受损凭证的官方文档,以获取更详细的信息。

除此之外,您可能需要考虑无密钥 API 身份验证,通过 利用工作负载识别联合


1
投票

您不应该直接从 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()
}

所以当你想拿到钥匙时你可以使用

  1. 碎片
Places.initialize(getApplicationContext(), requireContext().getKey());
  1. 活动
Places.initialize(getApplicationContext(), this.getKey());

0
投票

这个答案的内容基本上可以通过 gradle Secrets 插件获得,如文档中所述:https://developers.google.com/maps/documentation/android-sdk/secrets-gradle-plugin

此外,请记住,当您在预发布报告中收到有关公开 api 密钥的错误,或者在审核后看到警告时,您可以在执行文档中描述的步骤后忽略此警告(

限制 API + gradle 插件秘密)。此警告不会消失,但不会阻止您发布应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.