Antes (00f1e6d): si la clave temporal estaba vencida se respondía «La clave temporal venció…» antes de verificar la clave y sin contar el fallo.
Ahora: se verifica siempre la clave temporal; si es incorrecta → fallo(); si es correcta pero vencida → fallo(). En los dos casos el mensaje es el genérico «Correo o contraseña incorrectos.» (o el de bloqueo al llegar a 5) y el intento se cuenta en login_attempts y en access_log.
Cambio de comportamiento colateral: ahora el 5.º fallo ya responde 429 (antes el 5.º daba 401 y el 6.º 429).
Ejecución: no hay cuenta con clave temporal vencida ni cuenta admin para crearla. Solo por código.