Split the registration request model from the registered-client record (#3181)

This commit is contained in:
Max 2026-07-27 23:11:01 +01:00 • committed by GitHub
commit d3ffe87960
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2940,6 +2940,17 @@ REQUIREMENTS: dict[str, Requirement] = {
transports=("streamable-http",),
note="Auth is enforced at the HTTP layer; Cache-Control is an HTTP header.",
),
"hosting:auth:as:register-echo": Requirement(
source="sdk",
behavior=(
"The bundled registration endpoint returns all registered metadata about the client "
"in its 201 response (RFC 7591 §3.2.1) - the client's `application_type` rather than a "
"substituted default, and `client_secret_expires_at` (0 when the secret never expires) "
"whenever a `client_secret` is issued."
),
transports=("streamable-http",),
note="Auth is enforced at the HTTP layer; the bundled AS is an ASGI app.",
),
"hosting:auth:as:register-error-response": Requirement(
source="sdk",
behavior=(
@ -3660,6 +3671,19 @@ REQUIREMENTS: dict[str, Requirement] = {
transports=("streamable-http",),
note="OAuth is HTTP-only.",
),
"client-auth:dcr:substituted-metadata": Requirement(
source="sdk",
behavior=(
"A 201 registration response whose echoed metadata the server substituted (RFC 7591 §3.2.1) - "
"an unregistered application_type, null redirect_uris, extra grant types - completes the flow; "
"substituted credentials the authorization-code flow cannot apply (an unimplemented "
"token_endpoint_auth_method; private_key_jwt, whose assertion it has no key to sign; or a "
"secret-based method with no client_secret issued) are instead reported as an "
"OAuthRegistrationError before the record is persisted or authorization begins."
),
transports=("streamable-http",),
note="OAuth is HTTP-only.",
),
"client-auth:dcr": Requirement(
source=f"{SPEC_BASE_URL}/basic/authorization#dynamic-client-registration",
behavior=(