Una aplicación web que he estado desarrollando tiene un nuevo caso de uso que me hace buscar algo más fácil que la autenticación de nombre de usuario / contraseña.
Los usuarios actuales no se inscriben en el servicio porque son un servicio b2b utilizado por sus compañías, por lo que para la autenticación de nombre de usuario / contraseña estándar, les enviamos su nombre de usuario y una contraseña temporal de uso único a través del correo electrónico. Se les pide que cambien su contraseña y acepten los términos de uso en el primer inicio de sesión.
Para este nuevo caso de uso, algunos subconjuntos de usuarios ahora solo ingresarán datos durante un período de 90 días que ocurre una vez al año. La mayoría de las veces, esto significa que solo estarán haciendo esto durante un día, tal vez dos, un año.
Debido a que les será fácil olvidar la contraseña que configuraron después de iniciar sesión con la contraseña temporal, me gustaría probar algo así como una URL única que caduca. La URL debe ser válida por 90 días (o al menos hasta que hayan terminado de ingresar sus datos si podemos averiguar cómo medir eso).
Cada año reciben un nuevo correo electrónico con una URL única para comenzar ese período de 90 días.
Los inconvenientes de seguridad aquí son los típicos:
- La URL única se muestra en los marcadores y en el historial del navegador
- La URL única se muestra en los registros del servidor
- El usuario puede reenviar el correo electrónico a otro buzón y el mensaje no se transporta de forma segura.
- Es necesario protegerse contra la inyección de SQL en la URL
Los esquemas de URL normalmente únicos son válidos por períodos cortos de 24 horas, por lo que me preocupa que un período de 90 días sea demasiado largo.
En cuanto a los riesgos: si una persona no autorizada obtiene acceso, habrá muy poca fuga de información (y, ciertamente, nada que sea PII), pero todavía hay algunas preocupaciones de "pérdida de confianza".
¿Esto es lo suficientemente seguro? Si no es así, ¿hay otros métodos de autenticación que podamos usar aquí?