【问题标题】:Managing PushSubscriptions within shared browsers在共享浏览器中管理 PushSubscriptions
【发布时间】:2017-12-04 20:31:01
【问题描述】:

正在使用WebPushServiceWorkers 解决围绕推送通知系统的一些用户体验注意事项。此外,这个系统应该优雅地处理共享同一浏览器的多个用户。

更具体地说,我有以下限制:

1) 用户不应看到不适合他们的通知。

2) 用户推送订阅的状态应该对其他用户不透明且不可更改。即我的推送订阅状态不应基于我自己以外的任何人的行为/行为。

满足第一个约束非常简单。我决定将当前登录的用户 ID 存储在 IndexedDB 中,并将预期用户的 ID 包含在推送有效负载中。如果这 2 个 id 匹配,那么只向用户显示推送通知就很简单了。

然而,满足约束 2 已被证明是非常难以捉摸的。到目前为止,我已经尝试过:

1) 用户和推送订阅之间的一对一映射。这是我尝试的第一件事,因为它给我的印象是最自然的映射。然而,这最终落空了,因为创建新的推送订阅将使前一个用户的订阅无效,从而要求原始用户在后续登录时创建另一个订阅,从而失败了第二个约束。

2) 共享推送订阅。这样做的好处是不会使推送订阅无效,因此原始用户的后续登录将按预期进行。但是,后续用户实际上都不需要向浏览器授予权限,因此第二个约束失败了。

3) 即使我能够使用上述 2 个选项之一,仍然没有什么可以阻止其他用户简单地转到浏览器设置并禁止通知,从而取消所有推送订阅。然而,我想这只是我必须忍受的事情,没有优雅的解决方案。

我确信已经有许多聪明的人致力于解决上述问题,所以我对上述约束 2 是如何得到有效满足的。

谢谢。

【问题讨论】:

    标签: service-worker web-push


    【解决方案1】:

    我在开发 Pushpad 时遇到了同样的问题。我们尝试了不同的解决方案,其中一些解决方案,例如用户和浏览器之间的多对多关系,很快就变成了一场噩梦。所以我会推荐以下方法,这被证明是对我们来说最好的方法。

    每个订阅(端点)都是一个设备(浏览器),一次最多可以关联一个用户尽可能尝试将数据与用户而非设备相关联。通过这种方式,订阅(端点)可以转移给不同的用户,并且您不会在端点过期或被替换时丢失数据。然后,当您需要发送通知时,根据用户数据过滤您的受众,找到收件人并将通知发送到相关设备。

    您可能希望与设备关联的唯一数据是设备首选项,并且设备首选项对于使用该浏览器的所有用户都是全局的。这与浏览器权限(允许/阻止)对所有用户都是全局的这一事实是一致的。

    上述解决方案部分满足您的要求:

    1) 用户不应看到不适合他们的通知。

    是的:

    • 当用户注销时,您可以删除用户与设备之间的关联
    • 当浏览器(用户)在您的网站上使用其他帐户登录时,您会将设备与新用户关联(并删除之前的关联)

    2) 用户推送订阅的状态应该对其他用户不透明且不可更改。

    是的,因为您不保留与设备关联的数据。您将数据与数据库中的用户相关联。

    【讨论】:

    • 感谢您的回复!除非我遗漏了什么,否则这似乎没有,但第一个用户实际上必须允许所有后续用户接收浏览器通知?澄清一下,用户 1 允许浏览器通知,因此创建推送订阅并将其关联到用户 1。现在用户 1 注销,因此取消推送订阅与他们的关联。当用户 2 登录时,浏览器会看到不需要提示他们允许通知,所以推送订阅会自动注册给他们。
    • @BrentHronik 是的,完全正确。
    【解决方案2】:

    没有办法同时满足这两个约束。您将需要选择一对一映射 (1) 或共享推送订阅 (2)。您不能使用浏览器来传递您的推送通知,同时期望来自同一个浏览器的某些行为(w.r.t. 权限、核攻击)......

    【讨论】:

    • 如果不能同时满足两个约束,怎么可能只满足秒约束?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2012-03-22
    • 2016-09-09
    • 2012-11-14
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多