如何同时使用“web-push”和“fcm-push”节点包?

Posted

技术标签:

【中文标题】如何同时使用“web-push”和“fcm-push”节点包?【英文标题】:How to work with "web-push" and "fcm-push" node packages simultaneously? 【发布时间】:2017-06-27 10:01:37 【问题描述】:

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

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

为什么有两个单独的键,即 GCM/FCM 和 VAPID? 从客户端获取订阅密钥到服务器后,是否需要将它们存储在数据库中?有没有其他方法可以保存? 看起来“fcm-push”包不支持 VAPID 键,它的 documentation 只提到它适用于 iosandroid。 另一方面,“web-push”包不支持 FCM。

那么,我应该同时使用这两个软件包吗?如果是,那么我应该依靠哪个包来执行哪个功能?

【问题讨论】:

web-push 确实支持 VAPID 和 FCM。 出于好奇,是什么让您认为 web-push 不支持 FCM? 【参考方案1】:

为什么有两个单独的键,即 GCM/FCM 和 VAPID?

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

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

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

一旦我从客户端获得订阅密钥到服务器,我需要将它们存储在数据库中吗?有没有其他方法可以保存?

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

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

看起来“fcm-push”包不支持 VAPID 密钥,而且它的文档只提到了 iOS 和 Android。

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

另一方面,“web-push”包不支持 FCM。

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

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

您说我订阅用户时需要将 VAPID 公钥关联到所有端点。关联到底是什么意思?

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

Sending VAPID identified WebPush Notifications via Mozilla’s Push Service Web Push Interoperability Wins

【讨论】:

您说我订阅用户时需要将 VAPID 公钥关联到所有端点。关联到底是什么意思? 另外,如果我只想在其中存储订阅,您建议使用哪个数据库? 还建议我应该使用哪个节点包来处理 VAPID。 @AnirudhGoel 我已经更新了答案(见最后一段)。任何数据库都可以:例如我使用 PostgreSQL。对于节点包我不知道,因为我使用过 Ruby,并且我们已经为 Pushpad 从头构建了所有内容。 请注意,web-push 确实支持 VAPID,因此支持 FCM。【参考方案2】:

web-push 确实支持 VAPID 和 FCM。如果您为旧版 Chrome 和 Opera 和三星互联网浏览器等浏览器提供 GCM API 密钥,它也支持 GCM,但这不是必需的,它是可选的。

【讨论】:

当我从 GCM api 密钥迁移到 VAPID 时遇到了一些问题(包括报告的 Chrome 错误)。我不建议将旧版 GCM api 密钥用于新项目。 我也不推荐它,但需要它来支持 Opera 和三星互联网浏览器。 可能您指的是旧版本,因为最新版本的 Opera(桌面和 Android)支持 VAPID。 很高兴听到。三星互联网浏览器是否也支持 VAPID?

以上是关于如何同时使用“web-push”和“fcm-push”节点包?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postman/curl 和 Angular 8 测试 FCM

如何使用nodejs向android chrome浏览器发送通知?

TTL 功能不适用于谷歌浏览器推送通知

如何在 Web 推送通知中从后端发送图像?

如何将数据从服务器传递到服务人员

如何同时使用交叉验证和提前停止?