我正在尝试实现推送通知(Push API)。我只想让登录的用户能够收到通知。
我需要实现的事件之一是 pushsubscriptionchange
在我的服务人员,所以我知道,它已经改变,我应该做一个。fetch
请求到我的数据库。目前我的参数是 old
和 new
订阅,但我看到的问题是我没有 jwt
token,同时发送该请求。这意味着这个案例中的api端点是不安全的,任何人都可以直接用 old
和 new
的订阅。
如果有人抢夺我的订阅,他可以用他自己的订阅来替换,然后执行我的不安全端点的api调用,从现在开始,他将代替我收到通知。
我正在寻找最佳实践。
把 jwt
中的indexeddb中,然后在service worker中,把它从 indexeeddb
. 这开始成为一个问题,因为当用户注销时,我必须从indexeddb中取出它,当 jwt
谁知道这会带来什么样的错误。
我能想到的另一个解决方案是,当用户登录时,我有一个取消订阅的代码,然后再订阅。这种方式看起来相当简单,因为别人永远不会轻易抢夺我的订阅。我不确定这是否是正确的方式。
你有什么看法?
为了使用JWT进行验证,我相信你的 "常规JavaScript"(而不是Service Worker)已经有了访问令牌的权限,并且在从客户端到服务器的所有请求中都包含了它。通常这个访问令牌会存在JS内存中(一些变量之类的),然后被附加到请求中。
要想把JWT放到SW中进行API通信,你应该使用postMessage API (https:/developer.mozilla.orgen-USdocsWebAPIWindowpostMessage。). 有了它,你可以在SW内部和页面上运行的代码之间进行通信。
你可以从SW向页面发送msg来请求令牌,然后让页面侧的JS将其发送给SW,SW可以反过来使用它来进行验证。或者你可以把SW从订阅变更事件中得到的任何信息发送给页面,让页面进行API调用。