当前位置: 首页 > 知识库问答 >
问题:

了解如何存储Web推送endpoint

阙佐
2023-03-14

我正试图开始在我的一个应用程序中实现网络推送。在我找到的示例中,客户端的endpointURL通常存储在内存中,注释如下:

在生产中,您会将其存储在数据库中。。。

因为只有我的应用程序的注册用户才能/将获得推送通知,所以我的计划是将endpointURL存储在我数据库中用户的元数据中。到目前为止,一切顺利。

当我想允许同一个用户在多个设备上接收通知时,问题就来了。理论上,我只会为用户订阅的每个设备向数据库添加一个新的终结点。但是,在测试中,我注意到endpoint会随着同一设备上的每次订阅/取消订阅而变化。因此,如果用户在同一设备上连续订阅/退订几次,我最终会为该用户保存几个endpoint(除了一个endpoint之外,所有endpoint都是坏的)。

据我所知,当用户取消订阅或终结点无效时,没有可靠的方法来通知。那么,我如何知道在添加新终结点之前是否应该删除旧终结点?

如何通过重复订阅/取消订阅向数据库中填充终结点来阻止用户有效地发起拒绝服务攻击?

这更像是一个玩笑(我可以明显地限制给定用户的总endpoint),但我看到的问题是,当需要发送通知时,我会用数百个无效endpoint的通知来关闭通知服务。

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

  1. 检查是否已为此用户/设备组合保存endpoint

问题是我不知道如何可靠地做到#1。

共有1个答案

危斯伯
2023-03-14

我将为用户订阅的每个设备向数据库中添加一个新endpoint

最好的方法是有这样一张表:

endpoint | user_id
  • endpoint上添加一个唯一的约束(或主键):您不想将同一个浏览器与多个用户关联,因为这是一个混乱(如果endpoint已经存在,但它有不同的用户id,只需更新与之关联的用户id
  • user_id是指向用户表的外键

如果用户在同一设备上连续订阅/退订几次,我最终会为该用户保存几个endpoint(除了一个endpoint之外,所有endpoint都是坏的)。

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

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

如何通过重复订阅/取消订阅向数据库中填充终结点来阻止用户有效地发起拒绝服务攻击?

如上所述,一旦意识到无效endpoint已过期或无效,就需要正确地删除它们。基本上,它们最多会生成一个无效请求。此外,如果吞吐量很高,服务器只需几秒钟就可以请求数千个endpoint。

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

 类似资料:
  • 我读过几篇关于为桌面浏览器实现网络推送通知的介绍性文章,但我无法理解在后端服务器上存储从用户浏览器获得的订阅背后的安全部分。 有许多网站请求允许向您发送推送通知,而无需先在这些网站上进行身份验证/注册。如果我授予他们权限,他们会将此权限字符串存储到后端服务器上以备日后使用,谁会说我不会生成另一个订阅字符串并将其发送到他们用于保存我的订阅的后端服务器的endpoint?因此,他们的数据库中充斥着订阅

  • 问题内容: 我有一个标记为的docker 映像,并且在dockerhub上有一个名为的私有仓库。 当我推动我的工作时,我最终总是会碰到公共仓库。 具体将我的图片推送到我的私人仓库的确切语法是什么? 问题答案: 您需要先使用正确标记图像: 然后码头工人使用相同的标签推。 例:

  • 我有一个docker图像标记为,我在dockerhub上有一个名为的私人回购 当我推我的时,我最终总是点击公共回购。 将我的图像推送到私人回购协议的确切语法是什么?

  • 我有一些关于实现推送通知的问题。事情是, > 订阅对象中的所有数据都是必需的吗?或者只有终点。 如果用户登录的设备超过10台,我是否需要为每个设备存储订阅值?是这样的吗?还是应该存储上次登录设备的订阅值?如果是这样,那么其余9个将不会收到任何通知。 如果您正在存储所有loggedin设备的订阅值,那么用户是否登录了多个浏览器?他会在每个浏览器中收到通知吗?这是标准做法吗? 欢迎提出建议,任何标准做

  • 问题内容: 我想了解ES如何在其索引内部存储日期值。可以转换为UTC吗? 我有一个日期类型的字段“ t”。这是映射: 现在,当我向ES插入/添加文档时,它如何存储在索引中。 “ t”:“ 1427700477165”(从Date.now()函数生成的毫秒数)。ES是否在UTC中识别其时代时间并按原样存储? “ t”:“ 2015-03-29T23:59:59”(我会相应地调整映射日期格式)-ES如

  • 我在试图理解令牌在Firebase存储中是如何工作的。 每当我的web应用程序将图像上传到FS,它就会在其公共URL中添加一个令牌。问题是,每当您将同一图像文件上传到web应用程序的另一个部分时,您似乎没有得到另一个文件,而是得到了已经上传的文件url的不同令牌,从而为以前注册的图像显示呈现403错误。 有办法解决这个吗? 如果用户重复这个过程,并在应用程序的另一个部分上传相同的picture.j