A forged request can't guess the HMAC key, and a forged request with an invalid key is refused. A replay is disallowed after the timeout. The server can also keep track of "spent" tickets until they would have timed out, preventing a replay even during the timeout period.
Basically it’s done like this:
1. The server passes a random string to the client
2. The client performs a calculation on the password and the random string
3. The client passes the username (in plain text) and the result of the calculation to the server
4. The server performs the same calculation as the client did and compares the output to the output of the client.
5. If it’s a match, the client is authentic.
In the case of tickets, the one signing is "this server then" and the one checking is "this server now", with a period of amnesia (about the data, not about the password) in between.