Estoy tratando de descubrir las mejores prácticas para trabajar con tokens de restablecimiento de contraseña.
Digamos que un usuario inicia el proceso de restablecimiento de la contraseña y luego se les envía por correo electrónico el token de restablecimiento y almacenamos una copia de hash en la base de datos. El token lleva la marca de tiempo en nuestra base de datos y se considerará caducado en, digamos, 24 horas.
Ahora considere dos escenarios para lo que podría suceder a continuación:
1) El usuario piensa que no recibió el correo electrónico, intenta restablecerlo nuevamente. ¿Debemos permitirle que genere otro token? Si lo hacemos, ¿deberíamos eliminar el token antiguo inmediatamente? (Todos ellos serán inválidos a partir de las 24 horas posteriores al problema datetime
...) Creo que minimizaría las llamadas de soporte si permitimos un poco de flexibilidad siempre y cuando expiren. ¿Hay algún tipo de ataque que no esté considerando aquí?
2) El usuario recibió el correo electrónico y hace clic en el enlace de restablecimiento, pero no completa el formulario de restablecimiento. ¿Cuándo debo eliminar el token de reinicio? Solo después de un restablecimiento exitoso, el usuario puede hacer clic en el enlace una y otra vez durante las 24 horas y solo se vuelve inválido una vez que finalmente restablece la contraseña. ¿O debería eliminar el token tan pronto como haga clic en el enlace para algún problema de seguridad? (todo esto ocurre antes de la expiración)