Problemas comuns e relatórios de bugs

Quando você tem um problema com o push da Web, pode ser difícil depurar o problema ou encontrar ajuda. Este documento descreve alguns dos problemas comuns e o que você deve fazer se encontrar um bug no Chrome ou no Firefox.

Antes de mergulhar na depuração de push, você pode estar tendo problemas com a depuração dos service workers, com o arquivo que não está sendo atualizado, com falha no registro ou geralmente apenas um comportamento incomum. Caso você ainda não tenha experiência com o desenvolvimento de service workers, é recomendado conferir este documento incrível sobre depuração de service workers.

Há dois estágios distintos a serem verificados ao desenvolver e testar o push na Web, cada um com seu próprio conjunto de problemas / problemas comuns:

  • Enviar uma mensagem: verifique se o envio das mensagens foi concluído. Você recebe o código HTTP 201. Se você não for:
  • Recebimento de uma mensagem: se você conseguir enviar uma mensagem, mas ela não for recebida no navegador:

Se não conseguir enviar e receber uma mensagem push e as seções relevantes neste documento não ajudarem a depurar o problema, é possível que você tenha encontrado um bug no próprio mecanismo de push. Nesse caso, consulte a seção Como gerar relatórios de bugs para enviar um bom relatório do bug com todas as informações necessárias para acelerar o processo de correção.

Uma coisa que gostaria de destacar antes de começarmos é que o Firefox e o serviço Mozilla AutoPush têm ótimas mensagens de erro. Se você tiver dificuldade e não tiver certeza de qual é o problema, faça o teste no Firefox e veja se recebe uma mensagem de erro mais útil.

Problemas de autorização

Os problemas de autorização são um dos problemas mais comuns que os desenvolvedores enfrentam ao começar com push da Web. Normalmente, isso é um problema com a configuração das chaves do servidor de aplicativos (também conhecidas como chaves VAPID) de um site.

A maneira mais fácil de oferecer suporte a push no Firefox e no Chrome é fornecer um applicationServerKey na chamada subscribe(). O lado negativo é que qualquer discrepância entre o front-end e as chaves do servidor resultará em um erro de autorização.

No Chrome e no FCM

Para o Chrome, que usa o FCM como um serviço de push, você receberá uma resposta UnauthorizedRegistration do FCM para uma série de erros diferentes, todos envolvendo as chaves do servidor do aplicativo.

Você receberá um erro UnauthorizedRegistration em qualquer uma destas situações:

  • Se você não definir um cabeçalho Authorization na solicitação para o FCM.
  • A chave do aplicativo usada para assinar o usuário não corresponde à chave usada para assinar o cabeçalho de autorização.
  • A expiração é inválida no seu JWT, ou seja, ela excede 24 horas ou o JWT expirou.
  • O JWT está incorreto ou tem valores inválidos.

A resposta completa de erro é semelhante a esta:

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

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

Se você receber essa mensagem de erro no Chrome, teste o Firefox para ver se ele pode fornecer mais informações para o problema.

Firefox e Mozilla AutoPush

O Firefox e o Mozilla AutoPush mostram um conjunto de mensagens de erro simples para problemas de Authorization.

Você também receberá uma resposta de erro Unauthorized do Mozilla AutoPush se o cabeçalho Authorization não estiver incluído na solicitação de 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 a expiração no seu JWT tiver expirado, você também receberá um erro Unauthorized com uma mensagem explicando que o token expirou.

{
  "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 as chaves do servidor de aplicativos forem diferentes entre o momento da assinatura e do cabeçalho de autorização, um erro Not Found será retornado:

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

Por fim, se houver um valor inválido no JWT (por exemplo, se o valor "alg" for um valor inesperado), você receberá o seguinte erro do 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"
}

Códigos de status HTTP

Diversos problemas podem resultar em um código de resposta diferente do 201 de um serviço de push. Veja abaixo uma lista de códigos de status HTTP e o que eles significam em relação a push da Web.

Código de status Descrição
429 Excesso de solicitações. O servidor de aplicativos atingiu um limite de taxa com um serviço de push. A resposta do serviço precisa incluir um cabeçalho "Retry-After" para indicar quanto tempo antes que outra solicitação possa ser feita.
400 Solicitação inválida. Um dos cabeçalhos é inválido ou está formatado incorretamente.
404 Não encontrado Nesse caso, você precisa excluir PushSubscription do seu back-end e aguardar uma oportunidade para assinar novamente o usuário.
410 Sair. A assinatura não é mais válida e precisa ser removida do back-end. Isso pode ser reproduzido chamando `unsubscribe()` em um `PushSubscription`.
413 O tamanho do payload é muito grande. O tamanho mínimo do payload a um serviço de push é de 4.096 bytes (ou 4 KB). Qualquer valor maior pode resultar nesse erro.

Se o código de status HTTP não estiver nessa lista e a mensagem de erro não for útil, verifique a especificação do Web Push Protocol para ver se o código de status é referenciado junto com um cenário de quando esse código de status pode ser usado.

Problema de criptografia do payload

Se você conseguir acionar uma mensagem push (ou seja, enviar uma mensagem para um serviço de push da Web e receber um código de resposta 201), mas o evento de push nunca for disparado no service worker, isso normalmente indica que o navegador não conseguiu descriptografar a mensagem recebida.

Se esse for o caso, você verá uma mensagem de erro no console DevTools do Firefox, da seguinte maneira:

Firefox DevTools com mensagem de descriptografia.

Para verificar se esse é o problema no Chrome, faça o seguinte:

  1. Acesse about://gcm-internals e clique no botão "Start Recording".

Registro interno do GCM do Chrome.

  1. Acione uma mensagem push e consulte o "Registro de falha de descriptografia de mensagem".

Registro de descriptografia interno do GCM.

Se houver um problema com a descriptografia do payload, você verá um erro semelhante ao exibido acima. Observe a mensagem AES-GCM decryption failed na coluna de detalhes.

Algumas ferramentas podem ajudar a depurar a criptografia se esse for o problema:

Problema de conexão

Se você não estiver recebendo um evento de push no service worker e não estiver vendo erros de descriptografia, é possível que o navegador não consiga se conectar a um serviço de push.

No Chrome, é possível verificar se o navegador está recebendo mensagens examinando o "Registro de recebimento de mensagem" (sic) em about://gcm-internals.

Os componentes internos do GCM recebem o registro da mensagem.

Se a mensagem não chegar a tempo, verifique se o status da conexão do navegador é CONNECTED:

Estado da conexão interna do GCM.

Se não for "CONECTADO", talvez seja necessário excluir o perfil atual e criar um novo. Se isso ainda não resolver o problema, gere um relatório do bug conforme sugerido abaixo.

Como gerar relatórios de bugs

Se nenhuma das opções acima ajudar com seu problema e não houver nenhum sinal da causa, informe o problema no navegador com o qual você está tendo problemas:

No caso do Chrome, o problema pode ser acessado em https://bugs.chromium.org/p/chromium/issues/list. No Firefox, o problema é encaminhado em https://bugzilla.mozilla.org/ (link em inglês).

Para gerar um bom relatório do bug, inclua os seguintes detalhes:

  • Navegadores em que você testou (por exemplo, Chrome versão 50, Chrome versão 51, Firefox versão 50, Firefox versão 51).
  • Um exemplo de PushSubscription que demonstra o problema.
  • Inclua exemplos de solicitação, ou seja, conteúdo de solicitações de rede para um serviço de push, incluindo cabeçalhos.
  • Inclua também quaisquer exemplos de resposta das solicitações de rede.

Se você puder fornecer um exemplo reproduzível, seja um código-fonte ou um site hospedado, isso geralmente acelera o diagnóstico e a solução do problema.

A seguir

Laboratórios de códigos