Passkey Authentication Service  ·  View 13 of 21  ·  Runtime

Critical Flow — One Authentication Ceremony

Seventeen messages, of which one is a timeout and is still the designed behaviour.

Editable source SVG draw.io All views
User WebAuthn client Authenticator Ceremony gateway Assertion verifier Ceremony store Credential store Risk engine 1. asks to sign in 2. POST /ceremony/begin 3. origin and rate checked 4. put challenge, TTL 300 s 5. challenge + allowCredentials 6. credentials.get() 7. signed assertion 8. POST /ceremony/finish 9. assertion 10. consume atomically 11. load key and verdict 12. signature, origin, flags 13. score, 15 ms deadline 14. timeout: unevaluated 15. counter observed 16. signed verdict 17. signed in Critical Flow — One Authentication Ceremony Message 14 is the designed case, not the exception: a risk engine that cannot answer in time marks the verdict unevaluated and the ceremony still completes. v 1.0 · owner Security & Identity Architecture · date 2026-10

Decisions

  • The challenge is consumed atomically before the signature is verified, so a replay cannot win a race against a valid assertion.
  • The credential and its admission verdict are loaded together, which is what lets verification be pure cryptography against a stored decision instead of a policy evaluation.
  • The risk engine is called with a 15 ms deadline and its timeout is drawn as the normal case: the ceremony completes and the verdict says "unevaluated" so the relying party can choose to step up.
  • The sign-counter observation is asynchronous. It is evidence, not a gate, except where tenant policy makes it one.

Assumptions

  • Two round trips to the platform per ceremony, which is why challenge issuance is the cheaper call and the one shed first.
  • Risk deadline 15 ms inside a 60 ms p99 budget.
  • Ceremony TTL 300 seconds, matching common WebAuthn client timeouts.

Risks

  • A ceremony store outage fails this flow closed at message 10, which is correct and still looks to the user like a broken login. The error taxonomy has to distinguish "restart the ceremony" from "stop trying" or the support desk cannot.