VAPID 公钥是否与应用程序服务器密钥客户端相同



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

var serviceWorkerRegistration = ...
serviceWorkerRegistration.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: urlB64ToUint8Array("......")
}).then(function(subscription) {
   ...
})

您可以将subscription对象发送到服务器,并在其中保存该对象。

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

import pywebpush
pywebpush.webpush(
    subscription,
    data,
    vapid_private_key="path_to_private_key.pem",
    vapid_claims={"sub": "mailto:example@example.com"},
)

这是我的问题:

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

是的,它属于同一个密钥对。这篇博文 Web Push Interoperability Wons 更清楚地说明了:

这个过程非常简单:

  1. 您的应用程序服务器创建公钥/私钥对。公钥将提供给 Web 应用。
  2. 当用户选择接收推送时,将公钥添加到 subscribe(( 调用的选项对象中。
  3. 当应用服务器发送推送消息时,请包含签名的 JSON Web 令牌以及公钥。

根据您在服务器上使用的库,您可能需要不同格式的私钥。例如,Python pywebpush需要一个 VAPID EC2 私钥 PEM 文件,或者一个 DER 格式和 base64 格式的字符串。

相关内容

  • 没有找到相关文章

最新更新