Escenario
Un cliente se enfrenta a un problema con sus usuarios: utilizan un servicio (web) varias veces al año y olvidan sus credenciales muy a menudo . Existe un procedimiento de recuperación de contraseña estándar, pero muchos de ellos simplemente llaman al servicio al cliente cada vez (pidiéndoles que generen una contraseña determinada ). Esto tiene algunas malas implicaciones:
- El personal de servicio al cliente conoce todas sus contraseñas.
- Los usuarios mantienen ocupado el servicio al cliente (y cuando no es tiempo de trabajo estas llamadas son caras para el cliente).
Tenga en cuenta que:
- Los usuarios pueden cambiar sus propias credenciales a algo significativo, pero simplemente no les importa porque usan este servicio solo dos o tres veces al año, por lo que desean hacer las cosas lo más rápido posible.
- Agregar una casilla de verificación "Recordarme" no es una opción porque está (en este caso) prohibido por la ley.
- El sitio almacena información médica muy sensible.
- El cliente desea ahorrar dinero, por lo que los dispositivos de hardware (como los lectores de tarjetas inteligentes y / o los lectores de huellas digitales) no son una opción.
Pregunta
Para resolver estos problemas, el cliente me pide que genere un ID único para cada usuario, este ID se puede agregar a la URL para autenticar automáticamente a ese usuario. Por ejemplo:
Los usuarios pueden decidir guardar esta ID en el lugar que prefieran (enlace en el escritorio, favoritos del navegador, escribirlo en un post-it) pero el propio cliente no es responsable de eso (recuerde que no podemos proporcionar un "recuérdeme" "característica debido a la ley).
No estoy hablando de un token de autenticación (almacenado como cookie en lugar de tupla de nombre de usuario y contraseña, como se explica en ¿Por qué usar un ¿El token de autenticación en lugar del nombre de usuario / contraseña por solicitud? ) pero un parámetro de URL.
Suponiendo:
- Este token generado automáticamente es lo suficientemente largo (digamos 30 ~ 60 caracteres) y suficiente aleatorio (cadena alfanumérica de mayúsculas y minúsculas).
- Se utilizan medidas de seguridad básicas (retrasos muy largos para tokens desconocidos y listas negras de IP).
- Almacenaré estos ID por separado de las credenciales normales , con hash (por supuesto) y con un algoritmo / parámetros diferentes a los de las contraseñas (debido a su longitud, puede ser incluso más simple o todavía necesito Bcrypt ?!)
- El parámetro se elimina de la URL después de la autenticación y el usuario se redirige.
¿Hay alguna otra preocupación de seguridad que no imagino? ¿Esto hace que la autenticación sea demasiado débil?
Posibles problemas en los que puedo pensar es que las URL se almacenan en el historial del navegador ...
EDIT
Poco más de contexto: el cliente mantendría su propia lista de tokens fijos (no modificables) asociados con los usuarios. Justo antes de que necesiten usar su servicio, les enviaría a todos un correo electrónico con el enlace mencionado (correo electrónico personalizado generado por lotes). En mi ejemplo, el protocolo es HTTP pero en realidad es HTTPS (incluso si no tengo ningún control sobre esto).
Pregunta adicional: ¿Hacer este token ayuda temporal? Cada vez que se envía un nuevo correo electrónico, se genera un nuevo token (con un tiempo de caducidad relativamente corto, una o dos semanas).