[java-idp-plugin-vci] 02/05: Accepting access tokens only in authorizarion header as per FAPI 2.0

Codeberg noreply at shibboleth.net
Mon Sep 28 15:53:43 UTC 2026


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

codeberg pushed a commit to branch dev/FAPI
in repository java-idp-plugin-vci.

View the commit online:
https://codeberg.org/Shibboleth/java-idp-plugin-vci/commit/d44905fdd4df00bc69f04b1e0caf5b188989a27b

commit d44905fdd4df00bc69f04b1e0caf5b188989a27b
Author: Janne Lauros <janne.lauros at csc.fi>
AuthorDate: Mon Sep 28 17:28:11 2026 +0300

    Accepting access tokens only in authorizarion header as per FAPI 2.0
---
 .../impl/OpenIDVCICredentialsRequest.java          | 12 ++++++++++-
 .../impl/OpenIDVCICredentialsRequestTest.java      | 24 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/openid-vci-impl/src/main/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequest.java b/openid-vci-impl/src/main/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequest.java
index fa550ee..0ad39f9 100644
--- a/openid-vci-impl/src/main/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequest.java
+++ b/openid-vci-impl/src/main/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequest.java
@@ -32,6 +32,10 @@ import com.nimbusds.oauth2.sdk.ParseException;
 import com.nimbusds.oauth2.sdk.ProtectedResourceRequest;
 import com.nimbusds.oauth2.sdk.http.HTTPRequest;
 import com.nimbusds.oauth2.sdk.token.AccessToken;
+import com.nimbusds.oauth2.sdk.token.AccessTokenType;
+import com.nimbusds.oauth2.sdk.token.BearerAccessToken;
+import com.nimbusds.oauth2.sdk.token.BearerTokenError;
+import com.nimbusds.oauth2.sdk.token.DPoPAccessToken;
 
 /**
  * Class partly implementing Open ID VCI Credential Request message as described
@@ -178,7 +182,13 @@ public class OpenIDVCICredentialsRequest extends ProtectedResourceRequest {
     public static OpenIDVCICredentialsRequest parse(final HTTPRequest httpRequest) throws ParseException {
         httpRequest.ensureMethod(HTTPRequest.Method.POST);
         httpRequest.ensureEntityContentType(ContentType.APPLICATION_JSON);
-        final AccessToken accessToken = AccessToken.parse(httpRequest);
+        final String authorization = httpRequest.getAuthorization();
+        if (authorization == null) {
+            throw new ParseException("Missing access token in Authorization header", BearerTokenError.MISSING_TOKEN);
+        }
+        final AccessToken accessToken = authorization.regionMatches(true, 0, AccessTokenType.DPOP.getValue(), 0,
+                AccessTokenType.DPOP.getValue().length()) ? DPoPAccessToken.parse(authorization)
+                        : BearerAccessToken.parse(authorization);
         final Map<String, Object> payload;
         try {
             payload = new ObjectMapper().readValue(httpRequest.getBody(), new TypeReference<Map<String, Object>>() {
diff --git a/openid-vci-impl/src/test/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequestTest.java b/openid-vci-impl/src/test/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequestTest.java
index 589eb00..bf6b35f 100644
--- a/openid-vci-impl/src/test/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequestTest.java
+++ b/openid-vci-impl/src/test/java/org/geant/shibboleth/plugin/openidvci/messaging/impl/OpenIDVCICredentialsRequestTest.java
@@ -22,6 +22,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import com.nimbusds.oauth2.sdk.ParseException;
 import com.nimbusds.oauth2.sdk.http.HTTPRequest;
+import com.nimbusds.oauth2.sdk.token.DPoPAccessToken;
 import org.testng.Assert;
 
 /**
@@ -65,6 +66,29 @@ public class OpenIDVCICredentialsRequestTest {
         Assert.assertNull(request.getCredentialResponseEncryption());
     }
     
+    @Test
+    public void successDPoP() throws ParseException {
+        httpRequest.setAuthorization("DPoP dGVzdDp0ZXN0");
+        OpenIDVCICredentialsRequest request = OpenIDVCICredentialsRequest.parse(httpRequest);
+        Assert.assertTrue(request.getAccessToken() instanceof DPoPAccessToken);
+        Assert.assertEquals(request.getAccessToken().getValue(), "dGVzdDp0ZXN0");
+    }
+
+    @Test(expectedExceptions = ParseException.class)
+    public void failTokenInQuery() throws Exception {
+        final HTTPRequest queryRequest = new HTTPRequest(HTTPRequest.Method.POST,
+                new URI("http://example.com?access_token=dGVzdDp0ZXN0"));
+        queryRequest.setContentType("application/json");
+        queryRequest.setBody("{\"credential_configuration_id\": \"org.iso.18013.5.1.mDL\"}");
+        OpenIDVCICredentialsRequest.parse(queryRequest);
+    }
+
+    @Test(expectedExceptions = ParseException.class)
+    public void failNoToken() throws ParseException {
+        httpRequest.setAuthorization(null);
+        OpenIDVCICredentialsRequest.parse(httpRequest);
+    }
+
     @Test(expectedExceptions = IllegalArgumentException.class)
     public void failProofAndProofs() throws ParseException {
         httpRequest.setBody("{\n" + "  \"credential_configuration_id\": \"org.iso.18013.5.1.mDL\",\n"

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


More information about the commits mailing list