Token firmado entre dos PWAs: HMAC-SHA256 sin backend
Necesitas pasar la identidad del usuario de una PWA a otra. Ambas aplicaciones se ejecutan en proyectos de Firebase separados. No comparten ninguna base de datos. No comparten ninguna autenticación.
Puedes resolver esto sin escribir código de backend. Solo necesitas la Web Crypto API del navegador y una URL firmada.
El problema: Una herramienta interna llamada PanelControl necesita abrir otro sitio llamado Orders. Cuando un usuario hace clic en un botón, el sitio Orders debe saber quién es el usuario. Los usuarios no deberían tener que iniciar sesión una segunda vez.
Tres formas de hacerlo:
- Firebase compartido: Requiere una base de datos compartida. No es posible en este caso.
- postMessage: Requiere el mismo dominio o una ventana emergente (popup). Es más difícil de gestionar.
- URL firmada con HMAC: Usar un enlace con un token. Esto funciona perfectamente.
Cómo funciona: HMAC crea una firma utilizando una clave secreta. El receptor utiliza la misma clave para verificar la firma. Si coinciden, el remitente es de confianza.
El flujo de trabajo:
- Lado del remitente:
- Crear un payload con el nombre de usuario y una marca de tiempo (timestamp).
- Firmar el payload usando HMAC-SHA256.
- Añadir la firma y el payload a una URL.
- Lado del receptor:
- Leer el token de la URL.
- Separar la firma del payload.
- Recalcular la firma utilizando el secreto compartido.
- Comprobar si el token ha expirado (por ejemplo, después de 5 minutos).
- Si es válido, establecer la identidad del usuario en la aplicación.
Detalles de implementación: La Web Crypto API es nativa de todos los navegadores modernos. Funciona con ArrayBuffer y no requiere librerías adicionales.
Para mantener todo limpio, el script del receptor se ejecuta en el head del documento. Verifica el token, comprueba la hora e inmediatamente limpia la URL usando history.replaceState. Esto elimina el token de la barra del navegador para que permanezca oculto.
Una nota sobre seguridad: La clave secreta reside en el código del cliente. Cualquier persona que use DevTools puede verla. Esto es aceptable para herramientas empresariales internas donde solo se pasan datos no sensibles, como un nombre.
Si construyes una aplicación pública con datos sensibles, utiliza un token del lado del servidor en su lugar. Para herramientas internas, este método basado solo en el cliente es rápido y eficaz.
Sin infraestructura adicional. Sin bases de datos adicionales. Solo herramientas nativas del navegador.
Fuente: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod
