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

时间:2017-05-10 13:58:04

标签: service-worker web-push vapid

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

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

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

要向订阅者发送推送消息,服务器需要发布到对象endpoint中的密钥subscription所指示的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这个术语,而不是在订阅时,所以我不相信这个假设是正确的。

1 个答案:

答案 0 :(得分:4)

是的,它属于同一个密钥对。此博文Web Push Interoperability Wins更清晰:

  

这个过程非常简单:

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

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