GCM API密钥应该保密吗?

时间:2016-07-08 01:04:57

标签: android google-cloud-messaging firebase-cloud-messaging

根据documentation

  

请勿在客户端代码中的任何位置包含API密钥。

在我们当前的Android应用程序中就是这种情况 - 代码中没有包含API密钥。但是,对于com.google.gms:google-services库的新版本3.0.0,它开始抛出错误Missing api_key/current_key,如下所述:Missing api_key/current key with Google Services 3.0.0

此外,Google的配置生成器https://developers.google.com/mobile/add?platform=android&cntapi=gcmgoogle-services.json文件中包含API密钥。

它应该被保密吗?或者将它包含在客户端应用程序中是否安全?

3 个答案:

答案 0 :(得分:4)

google-services.json文件代表Firebase中所有可用服务的配置。有一些服务需要和“Android”API密钥。这些是您可以在google-services.json文件中找到的API密钥。您的应用可能会也可能不会使用这些API密钥,具体取决于您的应用使用的Firebase API。

FCM有一个“服务器”API密钥用于发送邮件,此API密钥不是google-services.json文件中包含的密钥。服务器API密钥永远不应包含在您的应用程序中。但是谷歌服务插件会在构建时查找这些Android API密钥,这可能是导致错误的原因,这不是因为您的FCM服务器API密钥丢失了。

答案 1 :(得分:2)

回答我自己的问题。

如果我在Firebase上创建一个新的测试项目(https://console.firebase.google.com),它还会包含API密钥

  • google-services.json for Android app,
  • 适用于iOS应用的GoogleService-Info.plist,
  • 对于Web App,它甚至建议将API密钥包含在我的HTML中。

认为HTML肯定是公开的,我现在非常确信它不是秘密。

答案 2 :(得分:0)

如果您使用GCM,您的Android应用程序无需了解API密钥。我只需要在json文件中包含api_key的空字段,以便GCM正常工作。正如在Missing api_key/current key with Google Services 3.0.0 and Maps API key in build.gradle回答中提到的那样,我只需在google-services.json中添加如下所示的行,以便GCM正常工作:

"api_key": [
  {
      "current_key": ""
  }
],

我认为您不应该包含API密钥,因为我认为只有您的服务器需要API密钥才能与Google进行身份验证,以请求它向目标接收者发送推送消息。如果有人掌握它,那将是一种风险。所以文件看起来像:

{
  "project_info": {
    ...
  },
  "client": [
    {
      "client_info": {
         ...
      },
      "oauth_client": [
        {
          "client_id": "yourid.whatever.com",
          ...
        }
      ],
      "api_key": [
        {
          "current_key": ""
        }
      ],
      "services": {
       ...
      }
    }
  ],
  "configuration_version": "1"
}

希望这有帮助。