¿Es seguro usar el siguiente mecanismo de autorización sin estado entre un cliente (iOS y Android) y el servidor?
Registrarse
-
El cliente proporciona un correo electrónico y una contraseña y guarda la contraseña clara en el
Keychain
de iOS y usa alternativa para Android. -
El servidor comprueba la seguridad de la contraseña si se considera lo suficientemente fuerte como para que el usuario se cree en la base de datos.
-
El servidor genera un
JWT token
y lo devuelve al cliente. El token tiene un tiempo de caducidad de 15 minutos. -
El cliente almacena el token (tal vez en el mismo
Keychain
) y lo incluye para cada solicitud siguiente en el encabezadoAuthorization
. -
Para cada solicitud, el servidor comprueba el token proporcionado (comprueba la firma y el tiempo de caducidad). Si está bien, la solicitud se procesa, de lo contrario, se devuelve un
HTTP 401
.
Iniciar sesión
-
Cuando el cliente recibe un
HTTP 401
del servidor, significa que se requiere un inicio de sesión. Entonces, la aplicación accede alKeychain
y recibe el correo electrónico & contraseña y la envía al servidor (no es necesaria la intervención del usuario). -
El servidor valida las credenciales proporcionadas y, si son válidas, repetirá los pasos Registrarse del 3 al 5.
Gracias al tiempo de caducidad en el token, si un token está comprometido, será válido durante un breve período de tiempo.
Si un usuario ha iniciado sesión en varios dispositivos y cambia su contraseña de un dispositivo, los otros dispositivos se mantendrán registrados solo durante un breve período de tiempo, pero la contraseña clara almacenada en Keychain
ya no será válida. Por lo tanto, se requerirá un nuevo inicio de sesión manual, lo cual creo que está bien.
¿Qué inconvenientes ve?
He estado pensando en usar actualizar token refresh token solo se usa una vez). Y por lo que he visto, almacenar la contraseña clara en el KeyChain
es lo suficientemente seguro:
Documentación de los servicios de KeyChain
¿Cuál es la mejor manera? mantener las credenciales de inicio de sesión en iOS?
Pero también he visto otras preguntas que no recomiendan almacenar contraseñas en el dispositivo.
Así que me gustaría escuchar las opiniones de otros sobre esto.