[java-idp-oidc] 01/04: JOIDC-253 - Facilitate extending the default set of request object claim validators

Henri Mikkonen henri.mikkonen at iki.fi
Mon Sep 8 10:53:13 UTC 2025


This is an automated email from the git hooks/post-receive script.

hjmikkon pushed a commit to branch main
in repository java-idp-oidc.

View the commit online:
http://git.shibboleth.net/view/?p=java-idp-oidc.git;a=commit;h=9d79c8a393337b6efd4dc52eb46f15f08ae9f6cb

commit 9d79c8a393337b6efd4dc52eb46f15f08ae9f6cb
Author: Henri Mikkonen <henri.mikkonen at iki.fi>
AuthorDate: Mon Sep 8 09:12:06 2025 +0300

    JOIDC-253 - Facilitate extending the default set of request object claim validators
    
    https://shibboleth.atlassian.net/browse/JOIDC-253
    
    Improve tests to cover the PAR flow
---
 .../op/profile/flow/PushedAuthorizeFlowTest.java   | 46 ++++++++++++++++++++++
 .../flow/TestRequestObjectClaimsValidator.java     | 13 +++++-
 2 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/PushedAuthorizeFlowTest.java b/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/PushedAuthorizeFlowTest.java
index ac83b90b..bdd730d9 100644
--- a/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/PushedAuthorizeFlowTest.java
+++ b/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/PushedAuthorizeFlowTest.java
@@ -852,6 +852,52 @@ public class PushedAuthorizeFlowTest extends AbstractOidcClientAuthenticationFlo
         assertErrorCode(result, OAuth2Error.INVALID_REQUEST_CODE);
     }
 
+    @Test
+    public void testOIDCResponseTypeInROExtraValidatorFailing() throws IOException, NoSuchAlgorithmException,
+            URISyntaxException, DataSealerException, ComponentInitializationException, JOSEException {
+        final String clientId = "clientIdRequireExtraRequestObjectClaim";
+        storeMetadata(storageService, clientId, clientSecret, scope, "https://example.org/cb");
+        setBasicAuth(clientId, clientSecret);
+        final JWTClaimsSet ro = new JWTClaimsSet.Builder()
+                .claim("iss", clientId)
+                .claim("client_id", clientId)
+                .claim("aud", issuer)
+                .claim("response_type", "code")
+                .claim("redirect_uri", "https://example.org/cb")
+                .claim("scope", "openid profile")
+                .build();
+        final SignedJWT requestObject = createSecretJWT(ro, clientSecret);
+        setHttpFormRequest("POST", createRequestParameters(clientId, null, null,
+                requestObject.serialize()));
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertErrorCode(result, OAuth2Error.INVALID_REQUEST_CODE);
+    }
+
+    @Test
+    public void testOIDCResponseTypeInROExtraValidatorSuccess() throws IOException, NoSuchAlgorithmException,
+            URISyntaxException, DataSealerException, ComponentInitializationException, JOSEException {
+        final String clientId = "clientIdRequireExtraRequestObjectClaim";
+        storeMetadata(storageService, clientId, clientSecret, scope, "https://example.org/cb");
+        setBasicAuth(clientId, clientSecret);
+        final JWTClaimsSet ro = new JWTClaimsSet.Builder()
+                .claim("iss", clientId)
+                .claim("client_id", clientId)
+                .claim("aud", issuer)
+                .claim("response_type", "code")
+                .claim("redirect_uri", "https://example.org/cb")
+                .claim("scope", "openid profile")
+                .claim("enforcedClaim", "enforcedValue")
+                .build();
+        final SignedJWT requestObject = createSecretJWT(ro, clientSecret);
+        setHttpFormRequest("POST", createRequestParameters(clientId, null, null,
+                requestObject.serialize()));
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertSuccessResponse(result, clientId);
+        final PushedAuthorizationSuccessResponse response =
+                parseSuccessResponse(result, PushedAuthorizationSuccessResponse.class);
+        verifyAuthorizeEndpoint(clientId, response.getRequestURI().toString());
+    }
+
     @Factory
     public Object[] createRequestObjectSecurityTests() {
         return new Object[] {
diff --git a/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/TestRequestObjectClaimsValidator.java b/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/TestRequestObjectClaimsValidator.java
index d01a3869..84de97d9 100644
--- a/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/TestRequestObjectClaimsValidator.java
+++ b/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/TestRequestObjectClaimsValidator.java
@@ -22,6 +22,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 
 import com.nimbusds.jwt.JWTClaimsSet;
 import com.nimbusds.oauth2.sdk.AuthorizationRequest;
+import com.nimbusds.oauth2.sdk.PushedAuthorizationRequest;
 import com.nimbusds.oauth2.sdk.id.ClientID;
 
 import net.shibboleth.oidc.jwt.claims.AbstractClaimsValidator;
@@ -37,8 +38,7 @@ public class TestRequestObjectClaimsValidator extends AbstractClaimsValidator {
         setActivationCondition((prc, claims) -> {
             return Optional.ofNullable(prc)
                     .map(ctx -> ctx.ensureInboundMessageContext().getMessage())
-                    .filter(AuthorizationRequest.class::isInstance)
-                    .map(AuthorizationRequest.class::cast)
+                    .map(msg -> parseAuthorizationRequest(msg))
                     .map(AuthorizationRequest::getClientID)
                     .map(ClientID::getValue)
                     .map(id -> "clientIdRequireExtraRequestObjectClaim".equals(id))
@@ -47,6 +47,15 @@ public class TestRequestObjectClaimsValidator extends AbstractClaimsValidator {
         });
     }
 
+    protected AuthorizationRequest parseAuthorizationRequest(final Object message) {
+        if (message instanceof AuthorizationRequest authzRequest) {
+            return authzRequest;
+        } else if (message instanceof PushedAuthorizationRequest parRequest) {
+            return parRequest.getAuthorizationRequest();
+        }
+        return null;
+    }
+
     /** {@inheritDoc} */
     @Override
     protected void doValidate(@Nonnull final JWTClaimsSet claims, @Nonnull final ProfileRequestContext context)

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list