Escribo código de back-end para aplicaciones móviles. Necesito escribir el código para la autenticación y la solución más simple y segura que se me ocurre es:
- Cuando el usuario inicia sesión, el dispositivo envía nombre de usuario y contraseña al servidor
- Si las credenciales son válidas, el servidor devuelve token
- El usuario envía token con cada solicitud
Detalles sobre el token
- En Java puedo crear el token como
UUID
(que se crea utilizandoSecureRandom
debajo del capó) - Escribo este token en la base de datos en la tabla
users
en la fila del usuario - En cada solicitud de aplicación móvil, hago
SELECT ... FROM users WHERE token = ?
y verifico si el usuario actual tiene permiso para realizar la operación - Periódicamente cambio
token
en la tablausers
para que caduque el token anterior
¿Es lo suficientemente bueno?
Parece seguro, pero no soy un experto en seguridad, así que pensé que lo pediría aquí. No he visto esta solución antes y me pregunto por qué.
- Alguien se quejaría del rendimiento debido a que golpea la base de datos cada vez, pero en la aplicación real, cada solicitud genera muchas consultas SQL, por lo que una más no debería ser un problema.
- Alguien podría quejarse de UUID, pero se sabe que, por lo que sé, en Java
UUID
s es imposible de adivinar debido a la implementación deSecureRandom
.
¿Esta solución es segura o hay agujeros que no pude ver?