Android 当我的移动应用向我的服务器报告其设备令牌时,我应该如何处理身份验证?

Android 当我的移动应用向我的服务器报告其设备令牌时,我应该如何处理身份验证?,android,ios,push-notification,apple-push-notifications,Android,Ios,Push Notification,Apple Push Notifications,我有一个应用程序可以在iOS和Android上运行。我正在努力将推送通知添加到该应用程序中 在非常高的级别上,设备向苹果推送通知服务(APNS)或谷歌云消息服务(GCM)注册并接收令牌。然后,他们将令牌交回负责发送通知的服务器。该服务器在需要时向APN或GCM发送通知,并说“将此通知发送到具有这些令牌的设备” 因此,我的应用程序需要能够安全地将其令牌发送到我的服务器,并在用户不再希望接收通知时从服务器上删除这些令牌。在服务器端添加一个简单的CRUD页面非常容易,它可以处理?create=,?de

我有一个应用程序可以在iOS和Android上运行。我正在努力将推送通知添加到该应用程序中

在非常高的级别上,设备向苹果推送通知服务(APNS)或谷歌云消息服务(GCM)注册并接收令牌。然后,他们将令牌交回负责发送通知的服务器。该服务器在需要时向APN或GCM发送通知,并说“将此通知发送到具有这些令牌的设备”

因此,我的应用程序需要能够安全地将其令牌发送到我的服务器,并在用户不再希望接收通知时从服务器上删除这些令牌。在服务器端添加一个简单的CRUD页面非常容易,它可以处理
?create=
?delete=
,等等

但是,当有人到我的服务器开始为
发送随机值时会发生什么呢?delete=
-看起来他们可以随意删除随机设备令牌

我更仔细地考虑了“删除”的情况,我认为这应该很容易:应用程序只需发送一个生成的公共解密密钥和初始的“创建此令牌”请求。可以针对令牌存储该密钥。当应用程序想要删除时,它可以发送令牌的加密副本,服务器可以将令牌与解密副本进行匹配,验证应用程序必须拥有与私有加密密钥匹配的存储公钥(这是只有应用程序才知道的秘密)

当有人开始向
发送随机值时会发生什么?create=
-他们会用假的设备令牌填充我的数据库表吗

我看不出一个简单的答案——对来自任何单一IP地址的“创建”请求进行速率限制似乎是我们在不涉及注册的情况下所能做的最好的事情。这显然无助于我们抵御任何分布式攻击


理想情况下,我希望在默认情况下启用推送通知,而无需用户“注册”或类似的操作。我的第一个想法是,每个设备令牌都应该绑定到一个已知的标准苹果ID或谷歌帐户上——但我如何阻止用户伪造这些令牌呢?设备是否带有我可以获得权威公钥的证书(在这种情况下,每个设备只能获得与其公钥绑定的一行)?在这里实现身份验证的最佳方法是什么?

这里有很多好问题。:)

让我试着把它分解一下

总体思路

  • 我认为在这里混合使用Android和iOS不是个好主意。它们之间的高级推送通知体系结构类似,但仅此而已

  • 令牌很长(我记得iOS令牌是uuid)。所以,仅仅通过随机尝试不同的值是无法猜测的。所以,我想说,
    ?delete=
    案例不存在

  • ?create=
    的情况更为现实。首先,有人可以让你的服务器屈服,注册数百万代币。此外,如果您通过推送通知发送一些敏感信息,您可能不希望非授权应用程序用户接收这些信息

Android解决方案

对于Android来说更容易

一旦在服务器上获得令牌,只需发送一条带有随机生成字符串的推送消息(将其存储在DB中)。设备上的应用程序将获取此字符串,并将其与令牌一起发送到服务器(通过第二次web调用)。并且您的服务器确保只有在对该令牌进行身份验证后,才会将任何内容发送到此令牌

通过这种方式,您可以依靠GCM将消息传递给正确的客户端,以确保身份验证信息(随机字符串)传递给您的应用程序

iOS解决方案

iOS的问题在于,如果应用程序挂起或处于后台,推送通知不会自动触发代码执行

因此,如果你尝试做同样的事情,而用户意外退出了你的应用程序,而推送通知正在发送,那么你的应用程序将永远看不到它

您可以执行以下操作(该想法与Android基本相同,只是不同之处在于我们可能需要用户交互)

  • 推送通知,并显示消息“请运行我的应用程序并输入X”(其中X是一些随机字符串)
  • 这样,如果您的应用程序位于后台,用户将单击此消息,输入X,您的应用程序将通过服务器的身份验证
  • 在这种情况下,如果应用程序位于前台,它将获得推送负载,并可以直接进行身份验证

    • 这里有很多好问题。:)

      让我试着把它分解一下

      总体思路

      • 我认为在这里混合使用Android和iOS不是个好主意。它们之间的高级推送通知体系结构类似,但仅此而已

      • 令牌很长(我记得iOS令牌是uuid)。所以,仅仅通过随机尝试不同的值是无法猜测的。所以,我想说,
        ?delete=
        案例不存在

      • ?create=
        的情况更为现实。首先,有人可以让你的服务器屈服,注册数百万代币。此外,如果您通过推送通知发送一些敏感信息,您可能不希望非授权应用程序用户接收这些信息

      Android解决方案

      对于Android来说更容易

      一旦在服务器上获得令牌,只需发送一条带有随机生成字符串的推送消息(将其存储在DB中)。设备上的应用程序将获取此字符串,并将其与令牌一起发送到服务器(通过第二次web调用)。并且您的服务器确保只有在对该令牌进行身份验证后,才会将任何内容发送到此令牌

      通过这种方式,您可以依靠GCM能力将消息传递给正确的客户端