在客户端,要订阅 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 更清楚地说明了:
这个过程非常简单:
- 您的应用程序服务器创建公钥/私钥对。公钥将提供给 Web 应用。
- 当用户选择接收推送时,将公钥添加到 subscribe(( 调用的选项对象中。
- 当应用服务器发送推送消息时,请包含签名的 JSON Web 令牌以及公钥。
根据您在服务器上使用的库,您可能需要不同格式的私钥。例如,Python pywebpush
需要一个 VAPID EC2 私钥 PEM 文件,或者一个 DER 格式和 base64 格式的字符串。