Problemas comuns e relatórios de bugs

Quando você encontra 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 Firefox.

Antes de mergulharmos no desbloqueio do push, você pode encontrar problemas com o desbloqueio de service workers, o arquivo não é atualizado, não é registrado ou geralmente tem um comportamento incomum. Há um documento incrível sobre como depurar service workers que eu recomendo conferir se você é novo no desenvolvimento de service workers.

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

  • Enviar uma mensagem:verifique se o envio foi bem-sucedido. Você vai receber um código HTTP 201. Caso contrário:
  • Receber uma mensagem: se você conseguir enviar uma mensagem, mas ela não for recebida no navegador:

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

Antes de começar, gostaria de destacar que o Firefox e o serviço AutoPush da Mozilla têm ótimas mensagens de erro. Se você tiver dificuldades e não souber qual é o problema, faça um teste no Firefox e verifique se você 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 a usar o push da Web. Isso normalmente é um problema com a configuração das chaves do servidor do aplicativo (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 um intervalo de erros diferentes, todos envolvendo as chaves do servidor do aplicativo.

Você vai receber um erro UnauthorizedRegistration em qualquer uma das seguintes situações:

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

A resposta completa de erro tem esta aparência:

<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, tente fazer o teste no Firefox para saber se ela vai fornecer mais informações sobre o problema.

Firefox e Mozilla AutoPush

O Firefox e o Mozilla AutoPush oferecem um conjunto de mensagens de erro amigáveis 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 sua solicitação 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 JWT tiver expirado, você também receberá um erro Unauthorized com uma mensagem explicando isso.

{
  "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 a assinatura do usuário e a assinatura 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 você tiver um valor inválido no JWT (por exemplo, se o valor "alg" for um valor inesperado), 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

Há uma variedade de problemas que podem resultar em um código de resposta diferente de 201 de um serviço push. Confira abaixo uma lista de códigos de status HTTP e o que eles significam em relação ao push da Web.

Código de status Descrição
429 Excesso de solicitações. O servidor de aplicativos atingiu o 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 de outra solicitação ser feita.
400 Solicitação inválida. Um dos cabeçalhos é inválido ou está mal formatado.
404 Não encontrado Nesse caso, exclua a PushSubscription do seu back-end e aguarde uma oportunidade para inscrever o usuário novamente.
410 Pronto. A assinatura não é mais válida e precisa ser removida do seu back-end. Isso pode ser reproduzido chamando "unsubscribe()" em um "PushSubscription".
413 O tamanho do payload é muito grande. O payload de tamanho mínimo que um serviço de push precisa oferecer é de 4096 bytes (ou 4 kB). Qualquer valor maior pode resultar nesse erro.

Se o código de status HTTP não estiver nesta lista e a mensagem de erro não for útil, verifique a especificação do protocolo de push da Web para saber se o código de status é referenciado com um cenário em que ele pode ser usado.

Problema de criptografia de payload

Se você conseguir acionar uma mensagem de 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 seu service worker, isso normalmente indica que o navegador falhou ao descriptografar a mensagem recebida.

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

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 procure no "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 mostrado acima. Observe a mensagem AES-GCM decryption failed na coluna de detalhes.

Há algumas ferramentas que 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 seu service worker e não estiver vendo erros de descriptografia, o navegador pode estar falhando ao se conectar a um serviço de push.

No Chrome, você pode verificar se o navegador está recebendo mensagens examinando o "Receive Message Log" (sic) em about://gcm-internals.

Registro de mensagens recebido por componentes internos do GCM.

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

Estado da conexão interna do GCM.

Se não estiver "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 e não houver nenhum sinal do que pode ser o problema, envie um problema relacionado ao navegador em que você está tendo problemas:

Para o Chrome, informe o problema aqui: https://bugs.chromium.org/p/chromium/issues/list Para o Firefox, acesse https://bugzilla.mozilla.org/

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ções (ou seja, conteúdo das solicitações de rede para um serviço de push, incluindo cabeçalhos).
  • Inclua também exemplos de respostas de solicitações de rede.

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

A seguir

Codelabs