Muchas API (servicios) de hoy usan OAuth, autenticación básica HTTP o claves API para autenticar a sus usuarios.
Mi objetivo es encontrar una forma simplista y segura para autenticar a los usuarios en una aplicación web del lado del cliente en una stateless para un servicio .
Métodos de autenticación
Esta es mi opinión sobre algunos de los métodos de autenticación:
OAuth parece una gran solución, pero parece muy complicada para la configuración y parece excesivo para un solo servicio.
-
Según OWASP " la autenticación HTTP básica no es segura y no debe utilizarse en aplicaciones ".
-
El uso de las claves de API sencillas en una aplicación web del lado del cliente no lo hace Parece una mejora en comparación con la autenticación HTTP básica.
Usando tokens encriptados
Mi idea alternativa es usar tokens encriptados que puedan ser verificados por el servicio.
- El texto simple del token contendrá el nombre de usuario , contraseña & la fecha de caducidad del token.
-
El texto sin formato se cifrará usando una clave secreta que solo es conocida por el servidor.
-
El texto sin formato se cifrará en el servidor utilizando AES en Modo GCM , para que la integridad no pueda ser manipulada.
El usuario debe iniciar sesión con su nombre de usuario y contraseña para recibir un token . Este token se envía con cada solicitud y se puede verificar en el servidor.
Para ilustrar:
+----------+ +-----------+
| +------ Login with user:pass ---->+ |
| Client | | API |
| +<---- Send encrypted token ----| |
| | | |
| +------ Use token to authenticate ---->+ |
+----------+ +-----------+
Verificación
La verificación se puede realizar mediante:
- Descifre el token utilizando la clave secreta .
- Verifique nombre de usuario y contraseña .
- Comprueba si el token ha caducado .
Pro's
Posibles ventajas de este enfoque:
- Los tokens se pueden almacenar en localStorage para mitigar los ataques CSRF y los usuarios pueden cerrar la sesión borrando el almacenamiento local.
- La información de inicio de sesión de texto simple no se envía en todas las solicitudes.
- Los tokens pueden caducar.
Contras
Posibles contras de este enfoque:
- Más carga en el servidor al descifrar cada solicitud.
- Un token está enlazado a un servidor específico.
¿Qué crees que es una buena solución? ¿Conoces otras buenas alternativas?