我目前正在设置一个Firebase Cloud Messing项目。将应用程序添加到此项目时,FCM 会自动生成一些凭据,例如服务器密钥以及 Android 和 iOS 客户端密钥。
对于Android,我可以下载并使用google-services.json文件来设置客户端,即注册FCM令牌并接收推送消息。但是,如何限制此设置,以便只有我的应用可以接收这些消息?
我以为这将是(自动创建的(Android客户端API密钥,因此为了进行测试,我在密钥的限制中放置了不正确的软件包名称和SHA指纹。没有效果,仍然可以接收消息。
然后,我尝试从google-services.json文件中完全删除API密钥以及oauth客户端信息,以确认设备将无法接收消息。没有效果,仍然可以接收消息。所有客户端信息似乎都被完全忽略,除了应用 ID(和常规项目信息(。
所以,我真的很想知道是什么阻止了应用程序的逆向工程来提取应用程序ID和一般项目信息,然后在完全不同的应用程序中接收推送消息?我不明白为什么Android客户端API密钥等包含在google-services.json文件中,或者如果不使用它,为什么甚至创建它们。
google-services.json
中的所有信息本质上都是配置数据,您的应用使用这些配置数据在 Google 服务器上查找 Firebase 服务。您不应该依赖了解或缺乏了解它作为安全机制。
相反,您应该以确保仅将邮件传递给目标收件人的方式发送邮件。其中很大一部分是将消息发送到特定的 FCM 实例 ID 令牌。Firebase 的实例 ID 令牌是无法猜测的。最初,此注册令牌仅在生成它的客户端设备上是已知的,并且该设备确定与谁共享它。
通过确保您的客户端代码仅与您自己的服务器端代码共享令牌,然后使用该代码来定位 FCM 消息,您可以创建一个完全安全的传递环境,您可以在其中完全控制谁可以接收每条特定消息。
另一方面是 FCM 主题,这是一种更简单的机制,用于向用户组传递消息。由于任何客户端都可以订阅它知道其 ID 的任何主题,因此主题应用于传递需要不太安全的目标传递的消息。
过去一周我一直与Firebase支持部门联系,以阐明这一点。现在弃用的Google Cloud Messaging (GCM(和Firebase Cloud Messaging (FCM(之间似乎有一个重要的区别,目前还没有很好的文档记录。
使用GCM,可以使用和限制例如带有软件包名称和SHA指纹的Android客户端API密钥。这在 FCM 中不再可能。这些密钥是在您在 Firebase 控制台中向项目添加应用时自动创建的,并包含在 google-services.json 文件中,您可以在 API 和服务中的凭据下添加这些限制,但它不会产生任何影响。
另请注意,您可以在 Firebase 项目中添加的 SHA 指纹仅适用于 Firebase 邀请或 Firebase 动态链接。
在决定使用消息传递服务的目的或从 GCM 迁移到 FCM 时,请小心并牢记这一点。
Firebase有一个功能请求,但他们目前没有时间表。现在还要求更新有关此问题的文档。