Tengo una API web pública para un SaaS. No tenemos cuentas de usuario para los usuarios, excepto para el administrador, simplemente porque los usuarios que usan el sistema a menudo son trabajadores o personal no permanente.
En su lugar, tenemos un número de cliente/cliente y un PIN que se utiliza para autenticar y configurar el cliente del navegador. El JWT autenticado se almacena en el navegador como cualquier otro token de acceso y se envía de vuelta al servidor junto con cada solicitud de API. Esto funciona bien, aunque entendemos que un actor malicioso podría potencialmente extraer este JWT y usarlo también para autenticarse de manera ilícita.
Ahora queremos agregar dos capas adicionales de seguridad: lista blanca de IP y dispositivos confiables.
Primero hemos introducido una lista blanca de IP. Esto es sencillo, simplemente verificamos la IP remota con una lista blanca creada por el administrador que está vinculada al número de cliente.
Ahora el problema está en la lista de dispositivos de confianza. Para cada número de cliente, debe haber una forma de confiar en un dispositivo para ese número de cliente específico. Por lo tanto, el cliente debe poder usar la API web solo en los dispositivos que tiene en la oficina. El escenario ideal sería que el administrador pueda emitir un certificado de "dispositivo de confianza" con una firma digital que firme algo así como " número de cliente + año + pin de cliente ". Luego, el administrador local debe importar este certificado/secreto manualmente en el dispositivo en el que se debe confiar.
Luego, para cada solicitud, nuestra aplicación de cliente web (a través de javascript) también envía esta firma con cada solicitud en un encabezado HTTP. Entiendo que esto también podría falsificarse, pero junto con la lista blanca de IP, evaluamos y creemos que debería ser lo suficientemente seguro para esta aplicación.
El problema ahora es, ¿cómo implementar eso? Hasta donde yo entiendo:
¿Cómo puedo gestionar (importar, almacenar y leer desde javascript) esta firma/certificado/secreto digital en el dispositivo cliente? El cliente web puede ser cualquier cosa, desde un iPad y un teléfono Android hasta un escritorio de Windows, Linux o iOS. Todas las llamadas web se realizan con SSL. No estamos ejecutando ninguna aplicación nativa en el dispositivo del cliente, solo el navegador.