Открытый ключ VAPID совпадает с клиентским ключом applicationServerKey?

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

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

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

Чтобы отправить push-сообщение подписчику, серверу необходимо опубликовать сообщение по адресу, указанному ключом 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:[email protected]"},
)

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

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


person Flimm    schedule 10.05.2017    source источник


Ответы (1)


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

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

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

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

person Flimm    schedule 10.05.2017