Является ли открытый ключ VAPID таким же, как на стороне приложения applicationServerKey?

На стороне клиента, чтобы подписаться на веб-push-уведомления, вам нужно позвонить subscribe с applicationServerKey вариант, вот так:

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

Вы можете отправить subscription объект на сервер, где его можно сохранить.

Чтобы отправить push-сообщение подписчику, серверу необходимо выполнить публикацию по URL-адресу, указанному ключом. endpoint в объекте subscription, Сервер должен идентифицировать себя с провайдером (Mozilla или Google или кем-либо еще), используя VAPID. Например, используя библиотеку Python pywebpushэтот вызов будет сделан:

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

Вот мой вопрос:

Является ли личный ключ VAPID, используемый для отправки push-сообщения, тем, который соответствует открытому ключу, переданному в serviceWorkerRegistration.pushManager.subscribe на стороне клиента? Или это относится к отдельной ключевой паре? Моя интуиция подсказывает мне, что она должна принадлежать к одной и той же паре клавиш, но термин VAPID упоминается только в том случае, когда речь идет об отправке push-сообщений, а не при подписке, поэтому я не уверен, что это предположение верно.

1 ответ

Да, он принадлежит к той же ключевой паре. Этот пост в блоге Web Push Interoperability Wins проясняет ситуацию:

Процесс довольно прост:

  1. Ваш сервер приложений создает пару открытый / закрытый ключ. Открытый ключ передается вашему веб-приложению.
  2. Когда пользователь выбирает получение толчков, добавьте открытый ключ к объекту опций вызова subscribe().
  3. Когда сервер приложений отправляет push-сообщение, включите подписанный веб-токен JSON вместе с открытым ключом.

В зависимости от того, какую библиотеку вы используете на сервере, вам может понадобиться закрытый ключ в другом формате. Например, pywebpush для Python ожидает файл PEM с закрытым ключом VAPID EC2 или строку в формате DER и base64.

Другие вопросы по тегам