[java-idp-oidc] 01/04: JOIDC-295 - PAR-endpoint doesn't store the verified DPoP proof thumbprint to the claims set

Codeberg noreply at shibboleth.net
Thu Nov 5 16:58:36 UTC 2026


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

codeberg pushed a commit to branch maint-4.3
in repository java-idp-oidc.

View the commit online:
https://codeberg.org/Shibboleth/java-idp-oidc/commit/9e0e54032c7a5650311579babb56e367fb44a8da

commit 9e0e54032c7a5650311579babb56e367fb44a8da
Author: Henri Mikkonen <henri.mikkonen at iki.fi>
AuthorDate: Wed Nov 4 12:13:15 2026 +0200

    JOIDC-295 - PAR-endpoint doesn't store the verified DPoP proof thumbprint to the claims set
    
    https://shibboleth.atlassian.net/browse/JOIDC-295
    
    Include the dpop_jkt claim into the redirect_uri claims set via OAuth2DPoPProofContext.getValidatedDpopProofThumbprint() if no request parameter was used
---
 ...ormOutbounPushedAuthorizationResponseMessage.java | 20 +++++++++++++++++---
 .../op/profile/flow/PushedAuthorizeFlowTest.java     | 10 ++++++----
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/idp-oidc-extension-impl/src/main/java/net/shibboleth/idp/plugin/oidc/op/oauth2/profile/impl/FormOutbounPushedAuthorizationResponseMessage.java b/idp-oidc-extension-impl/src/main/java/net/shibboleth/idp/plugin/oidc/op/oauth2/profile/impl/FormOutbounPushedAuthorizationResponseMessage.java
index 141cbe11..c7aa5f00 100644
--- a/idp-oidc-extension-impl/src/main/java/net/shibboleth/idp/plugin/oidc/op/oauth2/profile/impl/FormOutbounPushedAuthorizationResponseMessage.java
+++ b/idp-oidc-extension-impl/src/main/java/net/shibboleth/idp/plugin/oidc/op/oauth2/profile/impl/FormOutbounPushedAuthorizationResponseMessage.java
@@ -17,7 +17,9 @@ package net.shibboleth.idp.plugin.oidc.op.oauth2.profile.impl;
 import java.net.URI;
 import java.text.ParseException;
 import java.time.Duration;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 
@@ -34,6 +36,7 @@ import com.nimbusds.oauth2.sdk.PushedAuthorizationRequest;
 import com.nimbusds.oauth2.sdk.PushedAuthorizationSuccessResponse;
 
 import net.shibboleth.idp.plugin.oidc.op.messaging.context.OIDCAuthenticationResponseContext;
+import net.shibboleth.idp.plugin.oidc.op.oauth2.messaging.context.OAuth2DPoPProofContext;
 import net.shibboleth.idp.profile.IdPEventIds;
 import net.shibboleth.oidc.profile.config.navigate.PushedAuthorizationRequestUriClaimsSetManipulationStrategyLookupFunction;
 import net.shibboleth.oidc.profile.config.navigate.PushedAuthorizationRequestUriLifetimeLookupFunction;
@@ -189,9 +192,20 @@ public class FormOutbounPushedAuthorizationResponseMessage extends AbstractOAuth
         final JWT requestObject = oidcContext.getRequestObject();
         if (requestObject == null) {
             assert requestMessage != null;
-            claimsSet = requestMessage.getAuthorizationRequest().toJWTClaimsSet().getClaims();
+            claimsSet = new HashMap<>(requestMessage.getAuthorizationRequest().toJWTClaimsSet().getClaims());
         } else {
-            claimsSet = requestObject.getJWTClaimsSet().getClaims();
+            claimsSet = new HashMap<>(requestObject.getJWTClaimsSet().getClaims());
+        }
+
+        if (!claimsSet.containsKey("dpop_jkt")) {
+            final String jkt = Optional.ofNullable(profileRequestContext.getInboundMessageContext())
+                    .map(msgCtx -> msgCtx.getSubcontext(OAuth2DPoPProofContext.class))
+                    .map(proofContext -> proofContext.getValidatedDpopProofThumbprint())
+                    .orElse(null);
+            if (jkt != null) {
+                log.debug("{} Included dpop_jkt from OAuth2DPoPProofContext to the claims set", getLogPrefix());
+                claimsSet.put("dpop_jkt", jkt);
+            }
         }
 
         if (manipulationStrategy != null) {
@@ -213,4 +227,4 @@ public class FormOutbounPushedAuthorizationResponseMessage extends AbstractOAuth
         assert claimsSet != null;
         return claimsSet;
     }
-}
\ No newline at end of file
+}
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 9029ed49..8e616d17 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
@@ -332,17 +332,19 @@ public class PushedAuthorizeFlowTest extends AbstractOidcClientAuthenticationFlo
 
     @SuppressWarnings("null")
     @Test
-    public void testWithValidDPoPProof() throws IOException, SessionException {
+    public void testWithValidDPoPProof() throws IOException, SessionException, JOSEException {
         storeMetadata(storageService, clientId, clientSecret, scope, "https://example.org/cb");
         setBasicAuth(clientId, clientSecret);
-        request.addHeader("DPoP", buildDPoPProof("POST", "http://localhost/idp/profile/oauth2/pushed-authorization",
-                createValidDPoPNonce(clientId)).serialize());
+        final SignedJWT proof = buildDPoPProof("POST", "http://localhost/idp/profile/oauth2/pushed-authorization",
+                createValidDPoPNonce(clientId));
+        request.addHeader("DPoP", proof.serialize());
         setHttpFormRequest("POST", createRequestParameters(clientId));
         final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
         assertSuccessResponse(result, clientId);
         final PushedAuthorizationSuccessResponse response =
                 parseSuccessResponse(result, PushedAuthorizationSuccessResponse.class);
-        verifyAuthorizeEndpoint(clientId, response.getRequestURI().toString());
+        verifyAuthorizeEndpoint(clientId, response.getRequestURI().toString(), 
+                proof.getHeader().getJWK().computeThumbprint().toString());
     }
 
     @Test

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


More information about the commits mailing list