【问题标题】:Is the VAPID public key the same as applicationServerKey client-side?VAPID 公钥是否与 applicationServerKey 客户端相同?
【发布时间】:2017-05-10 13:58:04
【问题描述】:

在客户端,要订阅网络推送通知,您需要使用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 这个词只在谈论发送推送消息时才被提及,而不是在订阅时,所以我不确定这个假设是否正确。

【问题讨论】:

    标签: service-worker web-push vapid


    【解决方案1】:

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

    过程非常简单:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2019-07-09
      • 2017-02-22
      • 1970-01-01
      • 2018-11-20
      • 2011-07-26
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多