问题标签 [vapid]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2401 浏览

java - [WebPush][VAPID] 请求失败,出现 400 UnauthorizedRegistration

我正在使用 VAPID 和有效负载加密为 WebPush 开发一个纯 Java 实现(我已经为 GCM 和 FCM 实现了)。然而,文档仍然是边际的,而且代码示例仍然不是实质性的。目前我正试图让它在 Chrome 中工作。尽管我使用 VAPID 获得了成功的订阅,但当我发送 Tickle 或 Payload 推送消息时,我会收到 400 UnauthorizedRegistration。我的猜测是它与授权标头或 Crypto-Key 标头有关。到目前为止,这是我为 Tickle 发送的内容(没有有效负载的推送通知):

我已经从 JWT 中的两个 JSON 中删除了空格,因为规范对空格的使用不是很清楚,这似乎是最安全的做法。再次将 x9.62 解码为 ECPoint 后签名验证,因此 publicKey 似乎有效编码。但是我不断收到回复:

根据 FCM 文档,这仅在发生 JSON 错误时才会发生,但是我觉得该规范根本没有涵盖 WebPush。现在我都尝试过在 Java Crypto 提供程序中构建,并且 BC 都产生了相同的结果。

一些代码片段进行澄清:

密钥生成:

x9.62 的 ECPublicKey:

签署 JWT 声明:

一些问题萦绕在我的脑海中:

  • 注册回复 JSON 中的 auth 字段是什么?因为据我所知,只有 p256dh 与基于服务器的 KeyPair 一起用于生成加密密钥。

    对 ietf 草案 03 的进一步研究在以下部分给出了答案:2.3 链接:https ://datatracker.ietf.org/doc/html/draft-ietf-webpush-encryption-03 此外,Vincent Cheung 的答案中的链接也给出了很好的答案解释

  • 该文档谈到了使用 Bearer/WebPush 和使用 Crypto-Key 标头或 Encryption-Key 标头的 VAPID 的不同标头用法。笏是正确的做法吗?

  • 任何想法为什么 FCM 服务器不断返回: 400 UnauthorizedRegistration ?

有人可以在这个问题中添加 VAPID 标签吗?它似乎还不存在。

0 投票
0 回答
1089 浏览

c# - 使用 VAPID 身份验证和 GCM 发送推送通知

我正在尝试向 GCM 发送推送通知,在 C# 中实现 VAPID,但我从服务器收到 400,并且在确定问题所在时遇到了一些麻烦。

我试图一步一步地遵循文档,但没有成功。

ECVault

我正在将保管库的公钥注册到服务工作者中,一个 base64String 的 _publicKeyBytes

JsonWebToken 生成器

VAPID 生成器和 VAPID 标头

这是结束代码,它尝试使用订阅端点发送通知

这里是编码助手类

谢谢你的时间

0 投票
2 回答
15565 浏览

web-push - 什么是 VAPID,它为什么有用?

我最近刚刚了解了 VAPID,并且一直在寻找它存在的原因以及它的目的是什么。Mozilla 的博客文章解释说“如果我们发现问题,包括 VAPID 信息会让我们与您联系”,但我不完全确定他们的意思。他们是否在进行某种监控以防止其他人模仿您的服务?

0 投票
3 回答
1960 浏览

ruby - 在Ruby中将公钥导出到base64

我有一个 PEM 格式的公钥,它是通过以下方式生成的:

我必须阅读 PEM 字符串并获得base64 url​​ 编码的字符串。我怎样才能在 Ruby 中做到这一点?

顺便说一句,我必须为 WebPush 协议执行此操作,该协议指出:

您必须将您的 VAPID 公钥作为 base64 url​​ 编码的字符串添加到 Crypto-Key 标头,并在其前面加上 p256ecdsa=。

0 投票
1 回答
1967 浏览

javascript - 在 Rails 中生成 VAPID 公钥并将其传递给 Javascript

为了将 Push API 与 VAPID 一起使用,我需要一个applicationServerKey

我使用 Ruby 在服务器端生成它:

然后我必须下载它:

密钥作为 base64 字符串从控制器返回:

问题是 Firefox 在我调用时返回此错误pushManager.subscribe

任何帮助表示赞赏。

更新:这让我发疯......我也尝试过使用十六进制而不是base64进行编码/解码,但我得到了同样的错误。

来自红宝石:

如您所见,它是一个 P-256 密钥(我不知道为什么它说 Private-Key 而不是 Public Key,但是,正如您从生成它的代码中看到的那样,它是一个公钥)。

然后我用 Javascript 下载十六进制字符串,fetch这就是我得到的:

从我在控制台中打印的中间步骤可以看出,密钥已正确处理。但是我仍然得到那个错误......

更新 2:相同的代码在 Chrome 中成功运行:我设法使用 VAPID 发送通知。这可能是一个 Firefox 错误。

0 投票
1 回答
969 浏览

ruby-on-rails - ActionView::Template::Error (nil:NilClass 的未定义方法 `tr'

我正在测试 service-worker rails gem 并使用 VAPID 私钥和公钥来发送推送通知。我已经成功地能够在本地创建推送通知,但是当我部署到 heroku 时,该应用程序在尝试转到推送通知页面时会引发上述错误。这是错误:

这是我的 webpushclient,其中定义了 VAPID 密钥:

这是我用来调用公钥的脚本:

就像我之前说的,它在本地工作。我想我可能忘记定义一个变量,我看过类似的帖子并且已经调试了很长时间,但没有运气。有什么建议么?我还想补充一下,我是新手,所以如果是明显的错误,我会完全理解。

0 投票
2 回答
2948 浏览

ruby-on-rails - Web Push with VAPID: 400/401 Unauthorized Registration

First of all, I've already check these questions, without any luck:

I am trying to implement web push notifications for a web app that I'm working on. Currently, I've achieved the following goals:

  • Create a VAPID keys pair (with this guide).
  • Register a service worker (only a service worker, I think that manifest.json is no longer required).
  • Subscribe the user to the server (subscription data will be stored in the database).
  • Send a push notification with webpush gem.

After setting it up, everything works fine (on localhost and on a remote machine). However, after some hours (between 12 and 24 hours), the notifications stop working on the remote machine (localhost works perfectly). After that time, the following errors are thrown when sending the push notifications from the server side (Rails):

  • Chrome: UnauthorizedRegistration 400 (no extra info).
  • Firefox: {"code": 401, "errno": 109, "error": "Unauthorized", "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes", "message": "Request did not validate Invalid bearer token: Auth > 24 hours in the future"}

After this error appeared, I tried to unsubscribe and resubscribe the user on every page visit. The subscription field on the db is updated after the resubscription is done, but the error is still being thrown, with the same information. No errors are thrown on the browser, nor service worker.

I've tried to force the resubscription manually by placing some js code on the Chrome Dev Tools console, unregistering the service worker, and reseting the push notification permissions, but nothing solves the error. I can only fix this error by creating a new VAPID key pair rebooting the remote machine. After crebooting the machine, I've another 12-24 hours before it fails again. Also, the notifications send process don't work neither on rails server (nginx + unicorn), rails console, nor irb.

I don't know where to go from now. Even worst, I can only try fixes once a day, since it'll break every 24 hours. I think I need some external help with a fresh vision of the problem. Am I missing something? Is there any OS dependency that VAPID uses and needs to be restarted?


Here are some code snippets that may be useful. Sorry for the mess, but I've done tons of modifications to try making it work.

Service worker registration:

User subscription and resubscription

Service worker:

Web push call:

0 投票
1 回答
8819 浏览

service-worker - VAPID 公钥是否与 applicationServerKey 客户端相同?

在客户端,要订阅网络推送通知,您需要subscribe使用applicationServerKey选项调用,如下所示:

您可以将subscription对象发送到可以保存的服务器。

要向订阅者发送推送消息,服务器需要发布到endpointobject 中的 key 指示的 URL subscription。服务器需要使用 VAPID 向提供商(Mozilla 或 Google 或其他任何人)表明自己的身份。例如,使用 Python library pywebpush,将进行以下调用:

这是我的问题:

serviceWorkerRegistration.pushManager.subscribe用于发送推送消息的私有 VAPID 密钥是否与传递给客户端的公钥对应?还是它属于单独的密钥对?我的直觉告诉我它应该属于同一个密钥对,但是 VAPID 这个词只在谈论发送推送消息时才被提及,而不是在订阅时,所以我不相信这个假设是正确的。

0 投票
4 回答
2973 浏览

java - 在 Java 中生成一个 VAPID 密钥并将它们传递给 JavaScript PushManager

我正在尝试在我的应用程序中使用带有网络推送协议的网络推送通知。为了将 Push API 与 VAPID 一起使用,我需要一个applicationServerKey.

PushManagersubscribe方法将 VAPID 密钥(仅公钥)作为参数,并将提供订阅端点和推送消息的密钥。

为了生成 VAPID 密钥,我一直在使用 node.js(谷歌web-push包),openssl直到现在。但在我的用例中,VAPID 密钥应该在 Java 中生成并传递给 JavaScript 以从浏览器订阅。

我正在尝试使用 Java 中的以下代码生成 VAPID 密钥。我能够成功创建密钥,但是当我传递生成的公钥(base64 编码的字符串)时,该subscribe方法返回一条错误消息:

无法注册服务工作者。DOMException:无法在“PushManager”上执行“订阅”:提供的 applicationServerKey 无效..

请帮我解决这个问题。下面是我的Java代码:

0 投票
2 回答
1811 浏览

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

我一直在尝试使用 Firebase Cloud Messaging 和一些节点包来设置 Web 推送通知服务器/客户端架构。在经历了多个教程之后,我真的很困惑。

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

  • 为什么有两个单独的键,即 GCM/FCM 和 VAPID?
  • 一旦我从客户端获得订阅密钥到服务器,我需要将它们存储在数据库中吗?有没有其他方法可以用来保存它们?
  • 看起来“fcm-push”包不支持 VAPID 密钥,它的文档只提到了 iOS 和 Android。
  • 另一方面,“web-push”包不支持 FCM。

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