El reseteo con token es correcto, pero hay un detalle que muchos omiten: el token debe ser de un solo uso y con expiración corta (15-30 minutos). Además, hashear el token con SHA-256 es suficiente porque es aleatorio y de alta entropía, pero asegúrate de usar una comparación en tiempo constante para evitar timing attacks. Otra cosa: si el usuario pide resetear varias veces, invalida los tokens anteriores. Y para el login, considera implementar autenticación de dos factores (2FA) como capa extra, aunque sea opcional. El hash simple nunca es suficiente, pero con bcrypt y buenas prácticas de sesión vas bien encaminado.