如何在service worker中获取jwt令牌?

问题描述 投票:0回答:1

我正在尝试实现推送通知(Push API)。我只想让登录的用户能够收到通知。

我需要实现的事件之一是 pushsubscriptionchange 在我的服务人员,所以我知道,它已经改变,我应该做一个。fetch 请求到我的数据库。目前我的参数是 oldnew 订阅,但我看到的问题是我没有 jwt token,同时发送该请求。这意味着这个案例中的api端点是不安全的,任何人都可以直接用 oldnew 的订阅。

如果有人抢夺我的订阅,他可以用他自己的订阅来替换,然后执行我的不安全端点的api调用,从现在开始,他将代替我收到通知。

我正在寻找最佳实践。

  • jwt 中的indexeddb中,然后在service worker中,把它从 indexeeddb. 这开始成为一个问题,因为当用户注销时,我必须从indexeddb中取出它,当 jwt 谁知道这会带来什么样的错误。

  • 我能想到的另一个解决方案是,当用户登录时,我有一个取消订阅的代码,然后再订阅。这种方式看起来相当简单,因为别人永远不会轻易抢夺我的订阅。我不确定这是否是正确的方式。

你有什么看法?

service-worker workbox
1个回答
0
投票

为了使用JWT进行验证,我相信你的 "常规JavaScript"(而不是Service Worker)已经有了访问令牌的权限,并且在从客户端到服务器的所有请求中都包含了它。通常这个访问令牌会存在JS内存中(一些变量之类的),然后被附加到请求中。

要想把JWT放到SW中进行API通信,你应该使用postMessage API (https:/developer.mozilla.orgen-USdocsWebAPIWindowpostMessage。). 有了它,你可以在SW内部和页面上运行的代码之间进行通信。

你可以从SW向页面发送msg来请求令牌,然后让页面侧的JS将其发送给SW,SW可以反过来使用它来进行验证。或者你可以把SW从订阅变更事件中得到的任何信息发送给页面,让页面进行API调用。

© www.soinside.com 2019 - 2024. All rights reserved.