node.js - 如何同时使用 "web-push"和 "fcm-push" Node 包?

标签 node.js google-cloud-messaging firebase-cloud-messaging web-push vapid

我一直在尝试使用 Firebase 云消息传递和一些 Node 包来设置网络推送通知服务器/客户端架构。在浏览了多个教程之后,我真的很困惑。

我尝试了“web-push” Node 包,但它需要 gcm-key,正如 Google 宣布的那样,GCM 现在正在转向 FCM。所以,我查看了另一个名为“fcm-push”的包,但它不支持 VAPID。我什至不确定为什么单独需要 VAPID。所以,我将在这里提出一些直接的问题-

  • 为什么有两个单独的 key ,即 GCM/FCM 和 VAPID?
  • 一旦我从客户端获得订阅 key 到服务器,我是否需要将它们存储在数据库中?有没有其他方法可以挽救他们?
  • “fcm-push”包似乎不支持 VAPID key ,它是 documentation仅针对 iOS 和 Android 提及。
  • 另一方面,“web-push”包不支持 FCM。

那么,我应该同时使用这两个包吗?如果是,那么我应该依靠什么包来完成哪个功能?

最佳答案

Why are there two separate keys, i.e., for GCM/FCM and VAPID?

GCM/FCM API key 是一种传统的非标准身份验证方法。 对于新项目您应该使用 VAPID,这是一个 standard ,使用推送服务(例如 FCM、Mozilla autopush)自动验证您的网络应用程序的方式。

基本上,当您为用户订阅推送通知时,您可以使用 VAPID 将公钥关联到端点。然后,当您想要向该端点发送通知时,您必须使用私钥对您的消息进行签名。

我在 Pushpad 工作几个月前我们已经从 GCM/FCM api key 迁移到 VAPID。现在 Pushpad 支持开箱即用的 VAPID:这意味着如果您使用 Pushpad,则不需要手动配置 VAPID,因为 VAPID 的所有配置都是自动发生的。我强烈推荐给check it out .

Once I get the subscription keys from the client to the server, do I need to store those in a database? Is there any other method that can be used to save them?

您可能混淆了两种不同类型的键:

  • VAPID key 对:您在服务器上生成一次;然后,当您使用 Javascript 为用户订阅网络推送通知时,将公钥关联到所有端点;您将私钥保存在您的服务器上,并使用它来签署您发送的通知
  • 用于签署通知负载的 key :这些 key 对于每个客户端都是不同的,您需要将它们与端点一起存储在您的服务器上; 只有在发送负载时才需要这些 key ;否则你可以只发送一个信号,然后 service worker 负责从你自己的应用服务器下载未读通知

It looks like "fcm-push" package doesn't support VAPID keys and it's documentation only mentions it for iOS and Android.

FCM 还用于向 native 应用程序发送推送通知,但 VAPID 是仅用于网络推送的标准。可能该 gem 旨在与 native 应用程序一起使用,而不是与网络推送一起使用。

On the other hand, "web-push" package doesn't support FCM.

是的,因为您需要使用标准的 VAPID。 FCM 也支持 VAPID。

注意:如其他答案中所述,“web-push”包可能也支持 FCM - 但是我不建议对新项目使用 FCM api key (使用 VAPID,这是IETF 标准!)

you said that I need to associate the VAPID public key to all the endpoints when I subscribe users. What do you exactly mean by associating it?

您可以在这些文章中阅读有关 VAPID 的更多信息:

关于node.js - 如何同时使用 "web-push"和 "fcm-push" Node 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44777435/

相关文章:

c# - JSONObject 中每个 JSONnode 的 Unity

android - 有没有什么方法可以在单个 google 服务器 api 调用中为每个设备 token 发送不同的消息?

Android "Urban Airship"- GCM - 未找到 Activity 设备 token

Firebase 云消息传递 click_action 格式是否特定于平台?

ios - token 在首次使用后未注册

firebase - FCM 向多个设备发送消息 - 使用哪种方式?

node.js - 将sails.js 与现有的postgres 数据库一起使用

node.js - Node Async/Await 不起作用,需要实现回调

javascript - 在客户端 JavaScript 代码中重用 Node.js 中的 Web 模型

android - GcmListenerService.onMessageReceived 未调用