了解如何存储Web推送端点

我试图在我的一个应用程序中开始实现Web推送。 在我发现的例子中,客户的端点URL通常存储在内存中,其注释如下所示:

在生产中,您可以将其存储在数据库中...

由于只有我的应用程序的注册用户才能/会得到推送通知,我的计划是将终端URL存储在我的数据库中的用户元数据中。 到现在为止还挺好。

问题出现在我想让同一用户在多个设备上接收通知时出现。 从理论上讲,我只会为用户订阅的每个设备添加一个新的端点到数据库。 但是,在测试中,我注意到终端会随着每个订阅/取消订阅而改变。 因此,如果用户在同一台​​设备上连续多次订阅/取消订阅,我最终会为该用户保存多个端点(除了其中一个端点以外都是坏的)。

从我读到的内容来看,当用户取消订阅或端点失效时,没有可靠的通知方式。 那么,如何在添加新终端前删除旧终端?

什么是阻止用户通过重复订阅/取消订阅填充我的数据库端点来有效地进行拒绝服务攻击?

这更像是一个笑话(我可以明显限制给定用户的总终点),但是我看到的问题是,当发送通知的时候,我会通知无数端点的通知服务。


我希望我的服务器上的订阅逻辑是:

  • 检查我们是否已经为此用户/设备组合保存了一个端点
  • 如果没有添加,则更新它
  • 问题是,我不知道如何可靠地做#1。


    我只会为用户订阅的每个设备添加一个新的端点到数据库

    最好的方法是制作这样的表格:

    endpoint | user_id
    
  • endpoint上添加一个唯一约束(或主键):您不希望将同一个浏览器关联到多个用户,因为它是一团糟(如果端点已经存在但它具有不同的user_id ,只需更新user_id与之相关)
  • user_id是指向用户表的外键
  • 如果用户在同一台​​设备上连续多次订阅/取消订阅,我会为该用户保存几个端点(除了其中一个端点外)。

    是的,不幸的是,推送API有一个狂放的取消订阅机制,你必须处理它。

    端点可能过期或可能无效(甚至可能是恶意的,如android.chromlum.info )。 当您尝试从您的应用程序服务器发送推送消息时,您需要检测失败(使用HTTP状态码,超时等)。 然后,对于某些类型的故障(永久故障,例如到期),您需要删除端点。

    什么是阻止用户通过重复订阅/取消订阅填充我的数据库端点来有效地进行拒绝服务攻击?

    正如我上面所描述的,一旦您意识到它们已过期或无效,您需要正确删除无效端点。 基本上他们会产生至多一个无效的请求。 而且,如果您的吞吐量很高,服务器只需几秒钟就可以请求数千个端点。

    我的建议是基于我在开发Pushpad时完成的大量实验和思考。

    链接地址: http://www.djcxy.com/p/40257.html

    上一篇: Understanding How to Store Web Push Endpoints

    下一篇: Android Studio External Native Build Precompiled Headers