Token Assinado Entre Duas PWAs: HMAC-SHA256 Sem Backend

Você precisa passar a identidade do usuário de uma PWA para outra. Ambos os aplicativos rodam em projetos Firebase separados. Eles não compartilham nenhum banco de dados. Eles não compartilham nenhuma autenticação.

Você pode resolver isso sem escrever código de backend. Você só precisa da Web Crypto API do navegador e de uma URL assinada.

O problema: Uma ferramenta interna chamada PanelControl precisa abrir outro site chamado Orders. Quando um usuário clica em um botão, o site Orders deve saber quem é o usuário. Os usuários não devem fazer login uma segunda vez.

Três maneiras de fazer isso:

  • Firebase compartilhado: Requer um banco de dados compartilhado. Não é possível aqui.
  • postMessage: Requer o mesmo domínio ou um popup. Mais difícil de gerenciar.
  • URL assinada com HMAC: Use um link com um token. Isso funciona perfeitamente.

Como funciona: O HMAC cria uma assinatura usando uma chave secreta. O receptor usa a mesma chave para verificar a assinatura. Se elas coincidirem, o remetente é confiável.

O fluxo de trabalho:

  1. Lado do remetente:
  • Crie um payload com o nome do usuário e um timestamp.
  • Assine o payload usando HMAC-SHA256.
  • Anexe a assinatura e o payload a uma URL.
  1. Lado do receptor:
  • Leia o token da URL.
  • Separe a assinatura do payload.
  • Recalcule a assinatura usando o segredo compartilhado.
  • Verifique se o token expirou (ex: após 5 minutos).
  • Se for válido, defina a identidade do usuário no aplicativo.

Detalhes de implementação: A Web Crypto API é nativa de todos os navegadores modernos. Ela funciona com ArrayBuffer e não requer bibliotecas extras.

Para manter as coisas limpas, o script do receptor é executado no head do documento. Ele verifica o token, checa o horário e limpa imediatamente a URL usando history.replaceState. Isso remove o token da barra do navegador para que ele permaneça oculto.

Uma nota sobre segurança: A chave secreta reside no código do cliente. Qualquer pessoa usando DevTools pode vê-la. Isso é aceitável para ferramentas de negócios internas onde você apenas passa dados não sensíveis, como um nome.

Se você construir um aplicativo público com dados sensíveis, use um token do lado do servidor em vez disso. Para ferramentas internas, este método apenas no cliente é rápido e eficaz.

Sem infraestrutura extra. Sem bancos de dados extras. Apenas ferramentas nativas do navegador.

Fonte: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod