我有一个跨 iOS 和 Android 运行的应用程序。我正在努力向该应用程序添加推送通知。
在非常高的级别上,设备向 Apple Push Notification Service (APNS) 或 Google Cloud Messaging (GCM) 注册并接收令牌。然后,他们将该令牌交还给负责发送通知的服务器。该服务器在需要时向 APNS 或 GCM 发送通知,并说“将此通知发送到具有这些令牌的设备”。
因此,我的应用程序需要能够安全地将其令牌发送到我的服务器,并在用户不再希望接收通知时从服务器中删除这些令牌。在服务器端添加一个简单的 CRUD 页面非常容易,它处理?create=<token>
,?delete=<token>
等。
但是,当有人访问我的服务器并开始向我的服务器发送随机值时会发生什么?delete=<token>
——他们似乎可以随意删除随机设备令牌?
我对“删除”案例进行了更多思考,我认为这应该很简单:应用程序只需发送生成的公共解密密钥和初始“创建此令牌”请求即可。该密钥可以针对令牌存储。当应用程序想要删除时,它可以发送令牌的加密副本,服务器可以将令牌与解密副本进行匹配,验证应用程序必须拥有与私有加密密钥匹配的存储公钥(这是一个已知的秘密仅适用于应用程序)。
当有人开始向随机值发送垃圾邮件时会发生什么?create=<token>
——他们是否只能用假设备令牌填充我的数据库表?
I can't see an easy answer — rate limiting "create" requests from any single IP address seems to be about the best we can do without registration involved. That obviously isn't going to help us against any distributed attack.
理想情况下,我希望默认启用推送通知/无需用户“注册”或类似的东西。我的第一个想法是每个设备令牌都应该与已知的规范 Apple ID 或 Google 帐户相关联——但我如何阻止用户伪造这些?设备是否带有我可以获得权威公钥的证书(在这种情况下,每个设备只能获得与其公钥绑定的一行)?我在这里实施身份验证的最佳方式是什么?