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

13

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

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

罪魁祸首代码如下。

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

根据我正在阅读的文档,我正在从BuildConfig中读取密钥并限制密钥。但问题仍然存在。如何解决这个问题。


5
这个手册上写着:“请注意:如果您已经对 API 密钥添加了限制,则可以忽略此警告。” 但同时,它也说这个警告不能被忽视。谷歌真笨。 - Daniel W.
你真的按照这个页面上的步骤做了吗?你是否已经将你的密钥与你的应用程序绑定? - Daniel W.
@DanielW。是的,我做了这个。 - Kamran Omar
3个回答

20

我也面临相同问题,找不到适当的解决方案。经过大量搜索,我找到了一个解决方案。因此,我提供了一个完整的解决方案。

感谢Prasenjit Banerjee的帮助。

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

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

  2. 然后按照设置Android Studio项目将API密钥添加到local.properties并在AndroidManifest.xml和主程序中使用它们。

  3. 最后,在您的AndroidManifest.xml文件中将API密钥作为变量访问:

<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
非常有用,我们在几个更新中一直苦恼于这个消息,谢谢 Milan! - Jorgesys
我们如何处理不同风味的不同键,有什么建议吗? - Hamid Javed
2
你能解释一下这到底实现了什么吗?我只看到你把API密钥从一个公开可访问的地方移到了另一个地方。访问清单条目就像读取BuildConfig变量一样简单。 - bompf
1
根据secrets-gradle-plugin文档,您可以设置特定于构建变体(构建类型或风味)的属性,在项目的根目录下创建与变体同名的属性文件。例如,要为release构建类型设置特定的密钥,创建一个名为release.properties的新文件,其中包含特定于发布的密钥。@HamidJaved @Amal - Milan Maji
1
根据secrets-gradle-plugin文档,您可以设置特定于构建变体(构建类型或风味)的属性,在项目的根目录下创建与变体同名的属性文件。例如,要设置特定于release构建类型的密钥,创建一个名为release.properties的新文件,其中包含特定于发布的密钥。@HamidJaved @Amal - undefined
显示剩余3条评论

1
为了保护您在GCP中的API密钥,您需要在Cloud Platform Console中搜索“凭据”。使用“创建凭据”按钮创建一个新的API密钥,并将其配置与已泄露的API密钥相同。 API密钥上的限制必须匹配,否则可能会导致停机。
将API密钥推送到所有使用旧密钥的位置,然后删除旧密钥。
我建议您查看官方文档,以了解有关在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. 片段(Fragment)
Places.initialize(getApplicationContext(), requiredContext.getKey());
  • 活动
  • Places.initialize(getApplicationContext(), this.getKey());
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接