Honour `response_mode` and use 303 on the authorize redirect
The fake AS's `/oauth/authorize` handler had two bugs that broke
fragment-mode public clients:
- It used `Redirect::permanent`, returning HTTP 308 instead of a
one-shot redirect status. 308 is permanent and cacheable, which is
wrong for OAuth, and some clients silently drop a 308 they never
asked for. The handler now emits 303 (See Other), which
unambiguously demotes the redirect to GET regardless of how the
user-agent reached `/oauth/authorize` — matching what most modern
OAuth providers (Auth0, Okta, etc.) use in practice.
- The `response_mode` parameter from PAR was discarded entirely. A
client that requested `response_mode=fragment` (common for
in-browser public clients) still saw `code` / `state` / `iss`
appended to the redirect URL's query string, and silently lost
the response since it was looking in the URL fragment.
A new `ResponseMode` enum is captured at PAR time and consulted
when building the redirect; both query and fragment modes are
declared in the served AS metadata, so honouring whichever the
client asks for is now consistent with the document.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>