Typowe problemy i zgłaszanie błędów

Gdy napotkasz problem z powiadomieniami push w internecie, może być trudno go debugować lub znaleźć pomoc. W tym dokumencie opisano niektóre typowe problemy i czynności, które należy wykonać, jeśli znajdziesz błąd w Chrome lub Firefoksie.

Zanim przejdziemy do debugowania powiadomień push, możesz napotkać problemy z debugowaniem skryptów service worker, nieaktualizowaniem pliku, niepowodzeniem rejestracji lub ogólnie nietypowym zachowaniem. Jeśli dopiero zaczynasz pracę z skryptami service worker, zdecydowanie zalecamy zapoznanie się z świetnym dokumentem na temat debugowania skryptów service worker.

Podczas tworzenia i testowania powiadomień push w internecie należy sprawdzić 2 etapy, z których każdy ma własny zestaw typowych problemów:

  • Wysyłanie wiadomości: upewnij się, że wiadomości są wysyłane prawidłowo. Powinien wyświetlić się kod HTTP 201. Jeśli nie jesteś:
  • Odbieranie wiadomości: jeśli udało Ci się wysłać wiadomość, ale nie została ona odebrana w przeglądarce:

Jeśli nie możesz wysyłać i odbierać wiadomości push, a odpowiednie sekcje w tym dokumencie nie pomagają w rozwiązaniu problemu, być może udało Ci się znaleźć błąd w samym mechanizmie push. W takim przypadku zapoznaj się z sekcją Zgłaszanie błędów, aby przesłać prawidłowy raport o błędzie zawierający wszystkie niezbędne informacje, co przyspieszy proces naprawiania błędu.

Zanim zaczniemy, warto wspomnieć, że Firefox i usługa Mozilla AutoPush mają świetne komunikaty o błędach. Jeśli utkniesz i nie będziesz wiedzieć, na czym polega problem, przetestuj kod w Firefoksie i sprawdź, czy pojawi się bardziej pomocny komunikat o błędzie.

Problemy z autoryzacją

Problemy z autoryzacją to jedne z najczęstszych problemów, z którymi borykają się deweloperzy, gdy zaczynają korzystać z powiadomień push w przeglądarce. Zwykle jest to problem z konfiguracją kluczy serwera aplikacji (nazywanych też kluczami VAPID) witryny.

Najprostszym sposobem na obsługę powiadomień push zarówno w Firefoksie, jak i Chrome jest podanie applicationServerKey w wywołaniu subscribe(). Wadą jest to, że każda rozbieżność między kluczami frontendu i serwera spowoduje błąd autoryzacji.

W Chrome i FCM

W przypadku Chrome, która używa FCM jako usługi push, otrzymasz odpowiedź UnauthorizedRegistration z FCM dotyczącą różnych błędów, które dotyczą kluczy serwera aplikacji.

Błąd UnauthorizedRegistration pojawi się w tych sytuacjach:

  • Jeśli nie zdefiniujesz nagłówka Authorization w żądaniu do FCM.
  • Klucz aplikacji użyty do zasubskrybowania użytkownika nie jest zgodny z kluczem użytym do podpisania nagłówka autoryzacji.
  • Data ważności w tokenie JWT jest nieprawidłowa, tzn. przekracza 24 godziny lub token JWT wygasł.
  • Token JWT jest nieprawidłowo sformatowany lub zawiera nieprawidłowe wartości.

Pełna odpowiedź z błędem wygląda tak:

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

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

Jeśli w Chrome pojawi się ten komunikat o błędzie, spróbuj przeprowadzić test w Firefoksie, aby uzyskać więcej informacji o problemie.

Firefox i Mozilla AutoPush

Firefox i Mozilla AutoPush wyświetlają przyjazne komunikaty o błędach w przypadku problemów z Authorization.

Jeśli w żądaniu push nie ma nagłówka Authorization, otrzymasz też odpowiedź o błędzie Unauthorized z Mozilla AutoPush.

{
  "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"
}

Jeśli token JWT wygasł, również otrzymasz błąd Unauthorized z komunikatem wyjaśniającym, że token wygasł.

{
  "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"
}

Jeśli klucze serwera aplikacji różnią się między momentem, w którym użytkownik został zasubskrybowany, a momentem podpisania nagłówka Authorization, zostanie zwrócony błąd 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"
}

Jeśli w tokenie JWT znajduje się nieprawidłowa wartość (np. wartość „alg” jest nieoczekiwana), otrzymasz od Mozilla AutoPush ten błąd:

{
  "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"
}

Kody stanów HTTP

Istnieje wiele problemów, które mogą powodować, że usługa push zwraca kod odpowiedzi inny niż 201. Poniżej znajdziesz listę kodów stanu HTTP i ich znaczenie w odniesieniu do powiadomień push w internecie.

Kod stanu Opis
429 Zbyt wiele żądań. Serwer aplikacji osiągnął limit liczby żądań w usłudze push. Odpowiedź z usługi powinna zawierać nagłówek „Retry-After”, który wskazuje, po jakim czasie można wysłać kolejne żądanie.
400 Nieprawidłowe żądanie. Jeden z nagłówków jest nieprawidłowy lub źle sformatowany.
404 Nie znaleziono. W takim przypadku należy usunąć PushSubscription z backendu i poczekać na możliwość ponownej subskrypcji użytkownika.
410 Usunięto. Subskrypcja nie jest już ważna i należy ją usunąć z backendu. Można to odtworzyć, wywołując funkcję `unsubscribe()` w obiekcie `PushSubscription`.
413 Rozmiar ładunku jest za duży. Minimalny rozmiar ładunku, który musi obsługiwać usługa push, to 4096 bajtów (lub 4 KB). Większe pliki mogą powodować ten błąd.

Jeśli kodu stanu HTTP nie ma na tej liście, a komunikat o błędzie nie jest pomocny, sprawdź specyfikację protokołu Web Push, aby dowiedzieć się, czy kod stanu jest wymieniony wraz ze scenariuszem, w którym może być użyty.

Problem z szyfrowaniem ładunku

Jeśli uda Ci się wywołać wiadomość push (czyli wysłać wiadomość do usługi push w internecie i otrzymać kod odpowiedzi 201), ale zdarzenie push nigdy nie zostanie wywołane w skrypcie service worker, zwykle oznacza to, że przeglądarce nie udało się odszyfrować otrzymanej wiadomości.

W takim przypadku w konsoli narzędzi deweloperskich Firefoksa powinien pojawić się komunikat o błędzie, na przykład:

Narzędzia deweloperskie w Firefoxie z komunikatem o odszyfrowaniu.

Aby sprawdzić, czy to jest przyczyną problemu w Chrome:

  1. Otwórz stronę about://gcm-internals i kliknij przycisk „Start Recording” (Rozpocznij nagrywanie).

Rekord wewnętrzny GCM Chrome.

  1. Wywołaj wiadomość push i sprawdź „Dziennik błędów odszyfrowywania wiadomości”.

Dziennik odszyfrowywania wewnętrznych danych GCM.

Jeśli wystąpi problem z odszyfrowaniem ładunku, zobaczysz błąd podobny do tego, który wyświetla się powyżej. (Zwróć uwagę na komunikat AES-GCM decryption failed w kolumnie szczegółów).

Jeśli problem dotyczy szyfrowania, możesz go rozwiązać za pomocą kilku narzędzi:

Problem z połączeniem

Jeśli nie otrzymujesz zdarzenia push w skrypcie service worker i nie widzisz żadnych błędów odszyfrowywania, przeglądarka może nie być w stanie połączyć się z usługą push.

W Chrome możesz sprawdzić, czy przeglądarka odbiera wiadomości, sprawdzając „Receive Message Log” (Dziennik odbierania wiadomości) w about://gcm-internals.

Dziennik wiadomości odebranych przez wewnętrzne komponenty GCM.

Jeśli wiadomość nie dotrze w odpowiednim czasie, sprawdź, czy stan połączenia przeglądarki to CONNECTED:

Stan połączenia wewnętrznego GCM.

Jeśli nie jest to „POŁĄCZONO”, konieczne może być usunięcie bieżącego profilu i utworzenie nowego. Jeśli to nie rozwiąże problemu, prześlij zgłoszenie błędu zgodnie z poniższymi instrukcjami.

Zgłaszanie błędów

Jeśli żadne z powyższych rozwiązań nie pomogło i nie wiesz, co może być przyczyną problemu, zgłoś problem z przeglądarką, której dotyczy:

W przypadku Chrome problem możesz zgłosić tutaj: https://bugs.chromium.org/p/chromium/issues/list W przypadku Firefoksa problem możesz zgłosić tutaj: https://bugzilla.mozilla.org/

Aby zgłoszenie błędu było przydatne, powinno zawierać te informacje:

  • Przeglądarki, w których przeprowadzono testy (np. Chrome w wersji 50, Chrome w wersji 51, Firefox w wersji 50, Firefox w wersji 51).
  • Przykładowy element PushSubscription, który obrazuje problem.
  • Dołącz przykładowe żądania (np. treść żądań sieciowych do usługi push, w tym nagłówki).
  • Dołącz też przykładowe odpowiedzi na żądania sieciowe.

Jeśli możesz podać przykład, który można odtworzyć, np. kod źródłowy lub hostowaną witrynę, często przyspiesza to diagnozowanie i rozwiązywanie problemu.

Co dalej

Ćwiczenia w Codelabs