ndovuoauth2

JWT inspectorno token yetruns in your browser · fetches key URLs only (a JWKS, or discovery then jwks_uri) · token bytes never leave the page
Get a token

paste by you - page memory only, never sent anywhere, never written to the URL · reload clears it

Share this scenario

this link carries only the view - safe to paste anywhere. The page's own URL never carries your pastes.

named links ship with the page: #scenario=kid-attacker restores the kid tamper · #view=wire opens the wire view.

RFC 9068 · JWT ACCESS TOKENS · THE RS CHECKLIST

The JWT inspector

0:00 / 5:41Read along

Paste or mint a token and watch a resource server think: parse, header policy, key selection, a real WebCrypto signature check, and the claims policy - with six tamper buttons that teach both ways a token dies.

Most tools decode a JWT and call it verified. This console is the other end of the pipe: theresource server's verification, step by step. The signatures are genuine WebCrypto over real fixture keys, the checks are the ones RFC 9068 section 4 makes mandatory, and the six tamper buttons split into the only two classes that matter: tokens whose signature breaks, and tokens whose signature is fine but whose claims are not. The wire view records every fetch - the only kind of network call this page can make is a key-set URL fetch, and it never carries token bytes.

What to take away
  • Decoding is not verifying. Steps 01-02 you can do by eye; only step 04 needs the key, and only step 05 needs the key and the context (who issued this, which API is it for?).
  • The verifier pins its algorithms and its keys. It never takes an alg from the header it is checking, and never follows jku/x5u - keys belong to the issuer you pinned, via discovery (RFC 8725 sections 3.1, 3.8, 3.10).
  • alg=none and the RS256-to-HS256 confusion are history, not folklore: both are quoted in RFC 8725, and the confusion shipped as CVE-2015-9235.
  • A valid signature proves the issuer vouched for these claims once - not that they still hold. Expiry and audience are the resource server's own checks, and skipping them serves stale and misrouted tokens all the same.
  • Every failure ends the same way: the RS answers 401 with WWW-Authenticate: Bearer error="invalid_token" (RFC 6750 section 3.1).
The fixtures

The console verifies against checked-in demo keys: one RSA-2048 and one P-256 keypair, published as a JWKS, plus a second "attacker" key set the kid tamper can name. Sample tokens are minted in your browser with liveiat/exp; an expired token and an alg=none token ship as static fixtures.

The private halves are published on purpose - these keys protect nothing. They are exhibits, the same standing as jwt.io's published sample secret: the lab is the one place where seeing the private key is the point.

References