GCM API密钥应该保密吗?

6
根据文档

不要在客户端代码中包含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密钥。
它应该保密吗?或者将其包含在客户端应用程序中是安全的吗?

google-services.json 文件包含 GCM 的设置。其中包含发送者 ID 和 API 密钥。您需要将其添加到模块以进行配置。 - mdtuyen
我认为标题应该是“GCM API密钥是否应该保密”。 - Enzokie
1
我已经有几年没有接触GCM了。以前有两个密钥:客户端密钥和发送者密钥。客户端密钥必须在应用程序中,最初是在清单文件的<meta-data>元素中。如果在注册过程中没有使用某些客户端密钥,我无法想象GCM如何工作。因此,除非Google创造了一些奇迹,否则我会认为他们的文档存在错误,并且客户端API密钥应该在客户端应用程序中。 - CommonsWare
1
@CommonsWare感谢您的评论。据我记得,情况恰好相反。SenderId以前是在客户端应用中使用的,用于生成设备令牌。而API_KEY是服务器用来与GCM进行身份验证的。请查看GCM API密钥vs发送者ID。这就是为什么建议不要在客户端应用中包含API密钥的原因。然而,对于这些相互矛盾的说法以及为什么现在需要将其包含在内的混乱感到困惑。 - Shobhit Puri
2
客户端密钥不需要保密,因为您可以在Web配置控制台上定义所有允许的应用程序ID以供任何给定的密钥使用。因此,即使有人获得了您的客户端密钥,他们也需要拥有您的应用程序ID,除非您提供签名密钥,否则他们无法获取。因此,请保持您的签名密钥保密,生活就会很美好。 - Richard Le Mesurier
显示剩余3条评论
3个回答

6

google-services.json文件表示Firebase中所有可用服务的配置。有些服务需要"Android" API密钥。这些API密钥可以在google-services.json文件中找到。根据您的应用程序使用的Firebase API,您的应用程序可能会或不会使用这些API密钥。

FCM有一个用于发送消息的"Server" API密钥,这个API密钥不是包含在google-services.json文件中的密钥。服务器API密钥不应该包含在您的应用程序中。然而,Google服务插件在构建时确实会查找这些Android API密钥,这可能是导致错误的原因,而不是因为缺少FCM服务器API密钥。


2
谢谢你的回答,Arthur。它帮了我很多。这两个不同是有道理的。 - Shobhit Puri
同意,这是为什么客户端密钥安全性不值得关注的完整解释。 - Richard Le Mesurier

2

回答自己的问题。

如果我在Firebase上创建一个新的测试项目(https://console.firebase.google.com),那么它会将API密钥包括在以下文件中:

  • Android应用程序的google-services.json文件,
  • iOS应用程序的GoogleService-Info.plist文件,
  • 对于Web应用程序,甚至建议将API密钥包含在我的HTML文件中。

考虑到HTML文件是公开的,现在我非常确信它不是秘密。


0

如果你正在使用GCM,你的Android应用程序不需要知道API密钥。我只需要在GCM的json文件中包含一个空字段api_key即可使其工作。正如在这里的答案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"
}

希望这能有所帮助。

2
@dmitryLazerka 如果你还认为谷歌的人员都知道他们在做什么,那么你还不是一个很久的安卓开发者。 - Kevin Krumwiede
坦白说,当我为 Firebase 生成 JSON 文件时,并没有生成 api_key 字段。如果我们能从 Google 的某个人那里得到答案就太好了。 - Shobhit Puri
实际上,当我再次从Firebase下载JSON配置文件(例如此处)时,我的生成的JSON中不包括current_key - Shobhit Puri
有趣的是,我刚刚再试了一次,它确实包含API密钥。如果您点击“添加Web应用程序”,它甚至建议您将其放入HTML中,这绝对是公开的。 - Dzmitry Lazerka
@DzmitryLazerka 我使用Firebase控制台进行下载。你是在尝试使用Google云控制台还是Firebase?也许这取决于所使用的API? - Shobhit Puri

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