You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit a845bed
Browse filesBrowse the repository at this point in the historyBrowse files
Ignore unsupported scope values, answer token errors with RFC 6749 codes, and state the granted scope
Unknown scope values are now ignored at the authorization and PAR
endpoints instead of failing the request with invalid_scope (OpenID4VCI
1.0 section 5.1.2, OpenID Connect Core 1.0 section 3.1.2.1, RFC 6749
section 3.3); ScopeRule logs the values it ignored. The id of a
credential configuration which can be requested through
authorization_details only is ignored as a scope the same way. A
credential issuance request left naming no credential configuration, by
scope or by authorization_details, is refused with invalid_scope
(OfferedCredentialsRule), with or without an offer.
The token endpoint answers with the error codes of RFC 6749 section
5.2: invalid_grant for a code which can not be decrypted or is
malformed, was issued to another client, or comes with another
redirect_uri; invalid_client (401, with League's challenge when the
Authorization header was used) where client authentication is missing
or fails, at the PAR endpoint too (RFC 9126 section 2.3). The caller is
authenticated from its own credentials and then compared with the
code's client, rather than authenticated against that client, so a
client disabled or expired since its code was issued can no longer
redeem it; the redirect_uri is compared, as sent, with the
authorization request's alone, no longer held to the registration
again.
Token responses, and implicit responses which return an access token,
state the granted scopes in scope (RFC 6749 sections 5.1 and 4.2.2),
every time, leaving out the ids of authorization-details-only
configurations.
ErrorResponder keeps every OAuth error_description, in a JSON body or a
redirect, to the characters RFC 6749 allows, as Routes already did for
the VCI endpoints, and passes League's invalid_client challenge on in
JSON error responses.
Upgrade notes for the OpenID Connect visible changes; the OpenID4VCI
compliance matrix closes G1 and G23 (rows 12 and 20).
| 3 | Authenticate the client the same way as at the token endpoint (§2.1, step 1). |`PushedAuthorizationController::__invoke()` via `AuthenticatedOAuth2ClientResolver::forAnySupportedMethod()`; confidential clients must authenticate. |`PushedAuthorizationControllerTest`: `testClientAuthenticationFailureThrows`, `testConfidentialClientMustAuthenticate`. |
25
+
| 3 | Authenticate the client the same way as at the token endpoint (§2.1, step 1). |`PushedAuthorizationController::__invoke()` via `AuthenticatedOAuth2ClientResolver::forAnySupportedMethod()`; confidential clients must authenticate. A client which fails to, or a confidential one which presents no authentication, is refused with `invalid_client` as at the token endpoint (§2.3, RFC 6749 section 5.2), with the challenge of its scheme when it used the Authorization header (`ErrorResponder::forExceptionJson()`). |`PushedAuthorizationControllerTest`: `testClientAuthenticationFailureThrows`, `testConfidentialClientMustAuthenticate`. |
26
26
| 4 | MUST reject the request if the `request_uri` parameter is provided (§2.1 step 2; §2.1-1 "MUST NOT be provided"). |`PushedAuthorizationController::__invoke()` rejects `request_uri` in the body. |`PushedAuthorizationControllerTest::testRejectsRequestUriInBody`. |
27
27
| 5 | MUST validate the pushed request as it would an authorization request at the authorization endpoint (§2.1 step 3). |`PushedAuthorizationController::__invoke()` runs the authorization request-rule pipeline (`StateRule`, `ClientRedirectUriRule`, `RequestObjectRule`, `ResponseModeRule`, `ScopeRule`, `RequiredOpenIdScopeRule`, `CodeChallengeRule`, `CodeChallengeMethodRule`, `DpopJktRule`, `IssuerStateRule`, `AuthorizationDetailsRule`, `OfferedCredentialsRule`); `resolveParametersToPersist()` refuses a request without `response_type`, which nothing could supply at redemption (row 23). |`PushedAuthorizationControllerTest::testHandlesValidParRequest`, `testRefusesAPushedRequestWithoutAResponseType` (and the rule-specific tests for each rule). |
0 commit comments