OAuth development

OAuth URL builder& callback inspector

Build a code-flow request or inspect a pasted callback. Start with the public example to see both sides.

OAuth URL builder

Request inputs

Enter raw values. The registered redirect URI is preserved exactly as a parameter.

Result

Everything runs in this browser tab. Inputs are not sent or saved.

Options

response_type=code · authorization code flow

Keep the verifier for the token request. Only its S256 challenge enters the URL; reports exclude the verifier.

Extra parameters: one raw key=value per line. Do not pre-encode values or repeat managed fields.

Enter values or load the example.

A failed login can begin with one extra slash in a redirect address or a plus sign decoded as a space. This OAuth URL builder gives you the assembled request and its decoded parameters together, so you can compare the values your client intends to send with those actually placed in the query.

Use the OAuth callback parser when you already have a return URL from a test run. It keeps every parameter row, including duplicates, and compares a separately supplied expected state. No successful parse is presented as proof that a code, token or user identity is valid.

Why use this OAuth URL builder

Keep the verifier out of the request

The OAuth URL builder derives an S256 challenge from the verifier you supply. The challenge goes into the OAuth authorization URL; the verifier stays in its input field and has a separate copy action for the later token request. Reports exclude the verifier.

Colored parameter cards feed one address bar while a private key stays beside it.

See both copies of a repeated state

A callback can contain state in its query and again in its fragment. The table preserves both rows and labels their origin. Even identical values are ambiguous, so the first matching value cannot hide a second unexpected one.

A callback splits into two parameter columns with matching colored rows highlighted as duplicates.

Keep the request and callback aligned

01

Enter the original redirect URI

Paste the exact registered URI, including its port, query and trailing slash. Do not encode the whole URI first: the builder treats that string as one parameter value. Extra parameters take raw key=value lines, even when a value contains an ampersand.

02

Generate a transaction deliberately

The state nonce generator creates independent values from 32 random bytes. It replaces nonce only when scope contains openid. Review the changed field count, apply, and retain the verifier for the same transaction. Editing a scope never silently regenerates it.

03

Choose when results refresh

Automatic mode waits 350 ms after changes. Turn it off to use Build or Parse, including Ctrl/Cmd+Enter. Copy and download stay disabled while a result is stale. Switching views preserves inputs; expected state in the callback view is entered separately.

Inspect the parts of an authorization transaction

One encoding pass

Nested redirect queries remain a single value. Existing endpoint parameters are decoded strictly, retained and encoded again with the new fields. A raw plus in an extra value becomes %2B, while spaces in the resulting query use form encoding.

Reproducible S256

Paste a verifier containing 43–128 allowed characters or generate one explicitly. SHA-256 hashes the exact verifier bytes; it does not decode base64 first. Disabling PKCE removes the challenge and method from the URL while retaining your input.

Source-aware callback inspection

Full URLs, ?query, #fragment and bare query strings are accepted. Decoding happens once: %252F becomes %2F, and %2B becomes a literal plus. Empty values and repeated names remain visible instead of being overwritten in an object.

State comparison with distinct outcomes

Missing, empty, repeated, unchecked, matching and mismatching state values produce different messages. A code mixed with an error, duplicate keys or query/fragment data is flagged for inspection. Export includes the full parameter list, even when the table shows its first 50 rows.

Supported inputs and deliberate limits

Authorization code only
Requests always use response_type=code. No implicit, hybrid or plain PKCE mode is offered. Nonce requires an openid scope here; its eventual check belongs in ID token validation, which this page does not perform.
URI checks are local syntax checks
Authorization endpoints require HTTPS, with HTTP allowed for localhost, 127.0.0.1 and [::1] testing. Redirects also allow reverse-domain native schemes such as com.example.app:/cb. Credentials, fragments, raw whitespace and malformed escapes are rejected. Provider registration is a separate check.
Reserved fields cannot be overridden
Endpoint queries and extra lines must not repeat names or supply the managed OAuth fields. Secrets, verifier, tokens, request objects and response_mode are rejected there. Provider presets, discovery, JAR/PAR and form_post reception are outside this tool.
Text inspection ends before login
The page never opens the authorization address, receives a live callback or exchanges a code. Ordinary fragments and hash-router paths are rejected. State matching does not establish issuer, signature, session binding, freshness or successful authorization.
Bounded, temporary work
Builder input is limited to 32,768 characters in total; callback and expected state each have that limit. Results allow at most 100 parameters. Drafts stay in page memory without saved history. Clear, example and random replacement use a preview and one undo that restores inputs and results.

OAuth URL builder FAQ

Why must the redirect URI match exactly?

Changing the scheme, port, path or trailing slash can identify a different callback. Register the exact intended value with your provider. This page preserves your redirect string as a parameter value; it cannot inspect the provider’s registered client settings.

How do state and nonce differ?

State comes back as a callback parameter and can be compared with the original transaction value. Nonce is bound to an ID token and must be checked after validating that token. Seeing a nonce field in a pasted callback is not an ID token check.

Do confidential clients still need PKCE?

A client secret authenticates the client at the token endpoint; PKCE also binds a code to its original verifier. Current OAuth security guidance recommends PKCE for confidential clients too. S256 is enabled here by default, but the provider must support it.

Can a client ID appear in the URL?

Yes. It is a public identifier. A client secret and the code_verifier serve different roles and must not go into the authorization query. The tool blocks those parameter names and gives the verifier its own copy button.

How does OpenID Connect differ from OAuth?

OAuth grants access to resources. OpenID Connect adds authentication, including an ID token. To prepare that request, include openid in scope and optionally supply nonce. This page builds the request; your application still needs to validate the returned ID token.

Found a calculation or validation issue?

Prepare the next request

Use the OAuth URL builder to compare a fresh request with your provider’s configuration, then inspect a pasted callback using the state you saved for that transaction.