Sign in with an email code
Spends the code and signs the contact in. The code arrived in the inbox, so it proves the address exactly like a magic link does: the contact is marked identified, the address is marked verified, and the session it mints is verified.
Every failure answers the same invalid_code — a wrong code, an expired or already-spent one, a challenge issued for another environment, and a challenge that never had a code behind it because the address has no account. Anything else would move the enumeration oracle here.
Each code carries an attempt budget of 5. A guess costs one whether or not it was right, and the code is dead when the budget runs out: six digits is a million, which a rate limit alone does not close.
With two-factor on, the answer is a TwoFactorChallenge instead of a session — the code is spent either way.
Rate limited to 20 requests per 5 minutes per IP.