About OAuth Flow Simulator
Every value on screen is generated here: the verifier and its hash, the code, the tokens. The access token is a genuine JSON Web Token signed with a key this tab invented, so a decoder opens it and one altered character breaks its signature — and it authenticates nothing, because nobody is listening at either end.
The specifications are precise about what each parameter means and unhelpful about the order things happen in, which is the part people actually get stuck on. This page plays a whole exchange out: the URL the browser is sent to, what the person sees, the redirect that comes back, the direct request that trades a code for tokens, the header the API is called with, and the answer. Each leg names who is talking to whom, shows the wire text, and lists the two or three details in it that matter.
Four flows are modelled. Authorisation code with proof key for code exchange is the default for anything with a person in front of it, whether that is a server-rendered site, a mobile app or a single-page app. Client credentials covers one service calling another with nobody signed in. The device flow is for screens that cannot show a browser — a television, a set-top box, a terminal on a machine with no display. Refresh covers what happens fifteen minutes later when the access token has expired and you would rather not interrupt anyone.
The proof key matters enough to have its own switch. With it on, the first request carries only a hash, the app keeps the original value in memory, and the final exchange sends that value over a direct connection the browser never touches; a code intercepted in the middle is then worth nothing on its own. Turn it off and the page shows the older shape for comparison: the same code, but nothing anywhere proves that the party redeeming it is the party that asked for it. That is the whole argument for the extra two lines of code, and it reads better as two sequences side by side than as prose.
A separate panel does what a resource server does when the token arrives: check the signature against the issuer's key, check that the issuer is the one it trusts, check that the audience names this API and not a neighbouring one, check the expiry, and check that the granted scope covers the request. Changing a single character of the token flips the first of those to a failure while the rest stay as they were, which is a useful thing to watch once. Audience confusion — accepting a perfectly valid token that was minted for somebody else's service — is the mistake this panel exists to make visible.
What is not here is any connection to an identity provider. There is no sign-in screen, no password field, no registered redirect URI and no client secret worth the name, because all of those require a server that knows you, and this site does not have one. The endpoint names are editable so the URLs can be made to read like your own system, and everything else is a model: accurate about the shape of the messages, silent about whatever your provider does differently in the details.