Problemi comuni e segnalazione di bug

Matt Gaunt

Quando si verifica un problema con le notifiche push web, può essere difficile eseguire il debug o trovare assistenza. Questo documento descrive alcuni dei problemi comuni e cosa devi fare se hai trovato un bug in Chrome o Firefox.

Prima di passare al debug delle notifiche push, potresti riscontrare problemi con il debug dei service worker stessi, con il file che non si aggiorna, con la mancata registrazione o, in generale, con un comportamento insolito. Esiste un fantastico documento sul debug dei service worker che ti consiglio vivamente di consultare se non hai esperienza con lo sviluppo di service worker.

Esistono due fasi distinte da verificare durante lo sviluppo e il test delle notifiche push web, ciascuna con i propri problemi comuni:

  • Invio di un messaggio: assicurati che l'invio dei messaggi vada a buon fine. Dovresti ricevere un codice HTTP 201. Se non lo sei:
    • Verifica la presenza di errori di autorizzazione: se ricevi un messaggio di errore di autorizzazione, consulta la sezione Problemi di autorizzazione.
    • Altri errori dell'API: se ricevi una risposta con un codice di stato diverso da 201, consulta la sezione Codici di stato HTTP per indicazioni sulla causa del problema.
  • Ricezione di un messaggio: se riesci a inviare un messaggio, ma questo non viene ricevuto nel browser:

Se non riesci a inviare e ricevere un messaggio push e le sezioni pertinenti di questo documento non ti aiutano a eseguire il debug del problema, potresti aver trovato un bug nel meccanismo push stesso. In questo caso, consulta la sezione Generazione di segnalazioni di bug per inviare una segnalazione di bug corretta con tutte le informazioni necessarie per accelerare il processo di correzione dei bug.

Prima di iniziare, vorrei sottolineare che Firefox e il servizio Mozilla AutoPush hanno ottimi messaggi di errore. Se non riesci a procedere e non sai quale sia il problema, esegui il test in Firefox e controlla se ricevi un messaggio di errore più utile.

Problemi di autorizzazione

I problemi di autorizzazione sono tra i più comuni che gli sviluppatori incontrano quando iniziano a utilizzare le notifiche push web. In genere, si tratta di un problema relativo alla configurazione delle chiavi del server applicazioni (note anche come chiavi VAPID) di un sito.

Il modo più semplice per supportare le notifiche push sia in Firefox che in Chrome è fornire un applicationServerKey nella chiamata subscribe(). Lo svantaggio è che qualsiasi discrepanza tra le chiavi del frontend e quelle del server comporterà un errore di autorizzazione.

Su Chrome e FCM

Per Chrome, che utilizza FCM come servizio push, riceverai una risposta UnauthorizedRegistration da FCM per una serie di errori diversi, tutti relativi alle chiavi del server dell'applicazione.

Riceverai un errore UnauthorizedRegistration in una delle seguenti situazioni:

  • Se non definisci un'intestazione Authorization nella richiesta a FCM.
  • La chiave dell'applicazione utilizzata per iscrivere l'utente non corrisponde alla chiave utilizzata per firmare l'intestazione Authorization.
  • La scadenza non è valida nel JWT, ovvero supera le 24 ore o il JWT è scaduto.
  • Il JWT non è in un formato corretto o contiene valori non validi.

La risposta di errore completa è simile alla seguente:

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

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

Se ricevi questo messaggio di errore in Chrome, prova a eseguire il test in Firefox per vedere se fornisce ulteriori informazioni sul problema.

Firefox e Mozilla AutoPush

Firefox e Mozilla AutoPush forniscono un insieme di messaggi di errore intuitivi per i problemi relativi a Authorization.

Riceverai anche una risposta di errore Unauthorized da Mozilla AutoPush se l'intestazione Authorization non è inclusa nella richiesta 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"
}

Se la scadenza nel JWT è scaduta, riceverai anche un errore Unauthorized con un messaggio che spiega che il token è scaduto.

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

Se le chiavi del server dell'applicazione sono diverse tra il momento in cui l'utente si è iscritto e quello in cui è stata firmata l'intestazione Authorization, verrà restituito un errore 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"
}

Infine, se il JWT contiene un valore non valido (ad esempio se il valore "alg" è un valore imprevisto), riceverai il seguente errore da 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"
}

Codici di stato HTTP

Esistono diversi problemi che possono comportare un codice di risposta diverso da 201 da un servizio push. Di seguito è riportato un elenco di codici di stato HTTP e il relativo significato in relazione alle notifiche push web.

Codice di stato Descrizione
429 Numero richieste eccessivo. Il tuo server applicazioni ha raggiunto un limite di frequenza con un servizio push. La risposta del servizio deve includere un'intestazione "Retry-After" per indicare quanto tempo deve trascorrere prima che sia possibile effettuare un'altra richiesta.
400 Richiesta non valida. Una delle intestazioni non è valida o è formattata in modo errato.
404 Non trovato. In questo caso, devi eliminare PushSubscription dal tuo backend e attendere l'opportunità di iscrivere nuovamente l'utente.
410 Non più disponibile. L'abbonamento non è più valido e deve essere rimosso dal tuo backend. Questo problema può essere riprodotto chiamando `unsubscribe()` su un `PushSubscription`.
413 Dimensioni del payload troppo grandi. La dimensione minima del payload che un servizio push deve supportare è di 4096 byte (o 4 kB). Qualsiasi dimensione superiore può generare questo errore.

Se il codice di stato HTTP non è presente in questo elenco e il messaggio di errore non è utile, consulta la specifica del protocollo Web Push per verificare se il codice di stato è indicato insieme a uno scenario in cui può essere utilizzato.

Problema di crittografia del payload

Se riesci ad attivare un messaggio push (ovvero a inviare un messaggio a un servizio push web e a ricevere un codice di risposta 201), ma l'evento push non viene mai attivato nel service worker, in genere significa che il browser non è riuscito a decriptare il messaggio ricevuto.

In questo caso, dovresti visualizzare un messaggio di errore nella console DevTools di Firefox, ad esempio:

Firefox DevTools con messaggio di decriptazione.

Per verificare se questo è il problema in Chrome, segui questi passaggi:

  1. Vai alla pagina about://gcm-internals e fai clic sul pulsante "Avvia registrazione".

Record interni di Chrome GCM.

  1. Attiva un messaggio push e controlla la sezione "Log degli errori di decriptazione dei messaggi".

Log di decriptazione degli elementi interni di GCM.

Se si verifica un problema con la decriptazione del payload, verrà visualizzato un errore simile a quello mostrato sopra. (Nota il messaggio AES-GCM decryption failed nella colonna dei dettagli).

Esistono alcuni strumenti che possono aiutarti a eseguire il debug della crittografia se questo è il tuo problema:

Problema di connessione

Se non ricevi un evento push nel service worker e non visualizzi errori di decriptazione, è possibile che il browser non riesca a connettersi a un servizio push.

In Chrome, puoi verificare se il browser riceve messaggi esaminando il "Log dei messaggi ricevuti" (sic) in about://gcm-internals.

Log dei messaggi ricevuti interni di GCM.

Se il messaggio non arriva in modo tempestivo, assicurati che lo stato della connessione del browser sia CONNECTED:

Stato della connessione interna GCM.

Se non è "COLLEGATO", potresti dover eliminare il profilo corrente e crearne uno nuovo. Se il problema persiste, invia una segnalazione di bug come suggerito di seguito.

Invio di segnalazioni di bug

Se nessuno dei suggerimenti precedenti risolve il problema e non ci sono indizi su quale potrebbe essere la causa, segnala un problema relativo al browser con cui stai riscontrando problemi:

Per Chrome, devi segnalare il problema qui: https://bugs.chromium.org/p/chromium/issues/list Per Firefox, devi segnalare il problema qui: https://bugzilla.mozilla.org/

Per fornire una buona segnalazione di bug, devi fornire i seguenti dettagli:

  • Browser con cui hai eseguito i test (ad es. Chrome versione 50, Chrome versione 51, Firefox versione 50, Firefox versione 51).
  • Un PushSubscription di esempio che dimostri il problema.
  • Includi eventuali richieste di esempio (ad es. i contenuti delle richieste di rete a un servizio push, incluse le intestazioni).
  • Includi anche eventuali risposte di esempio alle richieste di rete.

Se puoi fornire un esempio riproducibile, sotto forma di codice sorgente o di sito web ospitato, spesso la diagnosi e la risoluzione del problema vengono velocizzate.

Passaggi successivi

Codelab