Распространенные проблемы и сообщения об ошибках

Когда вы сталкиваетесь с проблемой с помощью web push, может быть сложно отладить проблему или найти помощь. В этом документе описаны некоторые распространенные проблемы и действия, которые следует делать, если вы обнаружили ошибку в Chrome или Firefox.

Прежде чем мы углубимся в отладку, вы можете столкнуться с проблемами самих рабочих служб отладки, файл не обновляется, не удается зарегистрироваться или вообще просто необычное поведение. Существует замечательный документ по отладке сервис-воркеров , который я настоятельно рекомендую прочитать, если вы новичок в разработке сервис-воркеров.

При разработке и тестировании веб-пуша необходимо учитывать два отдельных этапа, каждый из которых имеет свой набор общих проблем:

  • Отправка сообщения: убедитесь, что отправка сообщения прошла успешно. Вы должны получить HTTP-код 201. Если вы не:
  • Получение сообщения : если вы можете успешно отправить сообщение, но оно не получено в браузере:

Если вы не можете отправлять и получать push-сообщения, а соответствующие разделы этого документа не помогают устранить проблему, возможно, вы обнаружили ошибку в самом механизме push-сообщений. В этом случае обратитесь к разделу «Сообщение об ошибках», чтобы подать хороший отчет об ошибках со всей необходимой информацией для ускорения процесса исправления ошибок.

Прежде чем мы начнем, я хотел бы отметить одну вещь : Firefox и служба Mozilla AutoPush выдают отличные сообщения об ошибках. Если вы застряли и не уверены, в чем проблема, проверьте Firefox и посмотрите, получите ли вы более полезное сообщение об ошибке.

Проблемы с авторизацией

Проблемы с авторизацией — одна из наиболее распространенных проблем, с которыми сталкиваются разработчики, когда начинают использовать веб-пуш. Обычно это проблема с настройкой ключей сервера приложений сайта (также известных как ключи VAPID) .

Самый простой способ поддержать push как в Firefox, так и в Chrome — это указать applicationServerKey в вызове subscribe() . Обратной стороной является то, что любое несоответствие между вашим интерфейсом и ключами сервера приведет к ошибке авторизации.

В Chrome и FCM

Для Chrome, который использует FCM в качестве службы push-уведомлений, вы получите ответ UnauthorizedRegistration от FCM для ряда различных ошибок, все из которых связаны с ключами сервера приложений.

Вы получите сообщение об ошибке UnauthorizedRegistration в любой из следующих ситуаций:

  • Если вам не удалось определить заголовок Authorization в запросе к FCM.
  • Ключ вашего приложения, используемый для подписки пользователя, не соответствует ключу, используемому для подписи заголовка авторизации.
  • Срок действия недействителен в вашем JWT, т. е. срок действия превышает 24 часа или срок действия JWT истек.
  • JWT имеет неверный формат или имеет недопустимые значения.

Полный ответ об ошибке выглядит так:

<html>
  <head>
    <title>UnauthorizedRegistration</title>
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <h1>UnauthorizedRegistration</h1>

    <h2>Error 400</h2>
  </body>
</html>

Если вы получили это сообщение об ошибке в Chrome, рассмотрите возможность тестирования в Firefox, чтобы узнать, поможет ли оно лучше понять проблему.

Firefox и Mozilla AutoPush

Firefox и Mozilla AutoPush предоставляют удобный набор сообщений об ошибках при проблемах Authorization .

Вы также получите ответ о Unauthorized ошибке от Mozilla AutoPush, если заголовок Authorization не включен в ваш push-запрос.

{
  "errno": 109,
  "message": "Request did not validate missing authorization header",
  "code": 401,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Unauthorized"
}

Если срок действия вашего JWT истек, вы также получите Unauthorized ошибку с сообщением, объясняющим, что срок действия токена истек.

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid bearer token: Auth expired"
}

Если ключи сервера приложений различаются между моментом подписки пользователя и подписанием заголовка авторизации, будет возвращена ошибка Not Found :

{
  "errno": 102,
  "message": "Request did not validate invalid token",
  "code": 404,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Not Found"
}

Наконец, если у вас в JWT недопустимое значение (например, если значение «alg» является неожиданным), вы получите следующую ошибку от Mozilla AutoPush:

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid Authorization Header"
}

Коды состояния HTTP

Существует ряд проблем, которые могут привести к получению кода ответа, отличного от 201, от службы push-уведомлений. Ниже приведен список кодов состояния HTTP и их значение применительно к веб-push.

Код состояния Описание
429 Слишком много запросов. Ваш сервер приложений достиг ограничения скорости с помощью службы push. Ответ службы должен включать заголовок «Retry-After», указывающий, через какое время можно будет сделать следующий запрос.
400 Неверный запрос. Один из ваших заголовков недействителен или плохо отформатирован.
404 Не найдено. В этом случае вам следует удалить PushSubscription со своей серверной части и дождаться возможности повторно подписаться на пользователя.
410 Ушел. Подписка больше не действительна, и ее следует удалить из вашей серверной части. Это можно воспроизвести, вызвав unsubscribe() для PushSubscription.
413 Размер полезной нагрузки слишком велик. Минимальный размер полезных данных, которые должна поддерживать служба push-уведомлений, составляет 4096 байт (или 4 КБ). Все, что больше, может привести к этой ошибке.

Если код состояния HTTP отсутствует в этом списке и сообщение об ошибке бесполезно, проверьте спецификацию протокола Web Push, чтобы узнать, указан ли код состояния вместе со сценарием, когда этот код состояния можно использовать.

Проблема с шифрованием полезной нагрузки

Если вы можете успешно запустить push-сообщение (т. е. отправить сообщение в веб-службу push и получить код ответа 201), но событие push никогда не запускается в вашем сервисном работнике, это обычно означает, что браузеру не удалось расшифровать полученное сообщение.

В этом случае вы должны увидеть сообщение об ошибке в консоли DevTools Firefox, например:

Инструменты разработчика Firefox с сообщением о расшифровке.

Чтобы проверить, является ли это проблемой в Chrome, выполните следующие действия:

  1. Перейдите на страницу about://gcm-internals и нажмите кнопку «Начать запись».

Запись внутренних данных Chrome GCM.

  1. Запустите push-сообщение и просмотрите «Журнал ошибок расшифровки сообщения».

Журнал расшифровки внутренних компонентов GCM.

Если возникнет проблема с расшифровкой полезных данных, вы увидите ошибку, аналогичную той, что показана выше. (Обратите внимание на сообщение AES-GCM decryption failed в столбце сведений.)

Есть несколько инструментов, которые могут помочь в отладке шифрования, если это ваша проблема:

Проблема с подключением

Если вы не получаете push-событие в своем сервис-воркере и не видите ошибок расшифровки, возможно, браузеру не удается подключиться к push-сервису.

В Chrome вы можете проверить, получает ли браузер сообщения, проверив «Журнал получения сообщений» (так в оригинале) в about://gcm-internals .

Внутренние устройства GCM получают журнал сообщений.

Если вы не видите, что сообщение приходит своевременно, убедитесь, что статус соединения вашего браузера CONNECTED :

Состояние внутреннего соединения GCM.

Если он не «ПОДКЛЮЧЕН», возможно, вам придется удалить текущий профиль и создать новый . Если это по-прежнему не решит проблему, отправьте отчет об ошибке, как предложено ниже.

Сообщения об ошибках

Если ничего из вышеперечисленного не помогает решить вашу проблему и нет никаких признаков того, в чем может быть проблема, пожалуйста, сообщите о проблеме в браузере, с которым у вас возникла проблема:

В случае Chrome вы должны поднять проблему здесь: https://bugs.chromium.org/p/chromium/issues/list. В случае Firefox вам следует поднять проблему на странице: https://bugzilla.mozilla.org/.

Чтобы предоставить хороший отчет об ошибке, вы должны предоставить следующую информацию:

  • Браузеры, в которых вы тестировали (например, Chrome версии 50, Chrome версии 51, Firefox версии 50, Firefox версии 51).
  • Пример PushSubscription , демонстрирующий проблему.
  • Включите любые примеры запросов (т. е. содержимое сетевых запросов к службе push-уведомлений, включая заголовки).
  • Также включите примеры ответов на сетевые запросы.

Если вы можете предоставить воспроизводимый пример, исходный код или размещенный веб-сайт, это часто ускоряет диагностику и решение проблемы.

Куда идти дальше

Лаборатории кода