Todo se reduce al riesgo. Existe hay cierto riesgo de que el enlace de restablecimiento pueda ser obtenido por un tercero, pero el tiempo que esto puede tardar es algo que supongo. Si el tercero tiene acceso a la cuenta de correo electrónico de alguna manera, entonces no importa de ninguna manera, pero existe la posibilidad de que el acceso esté limitado hasta que el usuario se aleje de su teclado sin recordar bloquear su pantalla. Lo que realmente se reduce es que, por lo trivial que es implementar, ¿por qué no haces que el enlace caduque después de 15/30/60 minutos?
Personalmente, al desarrollar una aplicación web con un sistema de reinicio de inicio de sesión, trato de evitar el uso de enlaces enviados por correo electrónico a menos que tenga que hacerlo absolutamente . Yo prefiero un sistema por el cual el usuario puede restablecer su contraseña en la aplicación web, lo que requiere que ingresen 2/3 partes de información que se configuró cuando se creó la cuenta (y luego, posiblemente, enviar un correo electrónico a un enlace / código / lo que sea). Por lo general, el usuario no puede cambiar la información, de modo que si la cuenta se ve comprometida, el tercero no puede impedir que el usuario real reinicie su contraseña.
Ningún método es una prueba completa, todo se reduce a tratar de mitigar los riesgos tanto como sea posible sin implementar algún tipo de ritual azteca que implique un sacrificio de sangre para restablecer las contraseñas.