[java-oidc-common] branch main updated: JCOMOIDC-158 - Add protocol message logging support to AuthnResponseDecoders
Codeberg
noreply at shibboleth.net
Wed Mar 11 17:12:38 UTC 2026
This is an automated email from the git hooks/post-receive script.
codeberg pushed a commit to branch main
in repository java-oidc-common.
View the commit online:
https://codeberg.org/Shibboleth/java-oidc-common/commit/1e1d11c097dc89feef7301349c88776be79256f7
The following commit(s) were added to refs/heads/main by this push:
new 1e1d11c0 JCOMOIDC-158 - Add protocol message logging support to AuthnResponseDecoders
1e1d11c0 is described below
commit 1e1d11c097dc89feef7301349c88776be79256f7
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Wed Mar 11 17:12:29 2026 +0000
JCOMOIDC-158 - Add protocol message logging support to
AuthnResponseDecoders
- Add fields to cover decoding the implicit and hybrid flow responses
https://shibboleth.atlassian.net/browse/JCOMOIDC-158
---
.../decoding/impl/BaseHttpOIDCRequestDecoder.java | 5 +++
.../impl/HTTPPostAuthnResponseDecoderTest.java | 49 ++++++++++++++++++++++
2 files changed, 54 insertions(+)
diff --git a/oidc-common-profile-impl/src/main/java/net/shibboleth/oidc/profile/decoding/impl/BaseHttpOIDCRequestDecoder.java b/oidc-common-profile-impl/src/main/java/net/shibboleth/oidc/profile/decoding/impl/BaseHttpOIDCRequestDecoder.java
index b2493865..7f805851 100644
--- a/oidc-common-profile-impl/src/main/java/net/shibboleth/oidc/profile/decoding/impl/BaseHttpOIDCRequestDecoder.java
+++ b/oidc-common-profile-impl/src/main/java/net/shibboleth/oidc/profile/decoding/impl/BaseHttpOIDCRequestDecoder.java
@@ -95,6 +95,11 @@ public abstract class BaseHttpOIDCRequestDecoder extends AbstractHttpServletRequ
if (message instanceof final AuthenticationSuccessResponse response) {
return MoreObjects.toStringHelper(this).omitNullValues()
.add("state", response.getState())
+ .add("response_mode", response.getResponseMode())
+ .add("access_token", response.getAccessToken())
+ .add("token_type", response.getAccessToken() != null ?
+ response.getAccessToken().getType() : null)
+ .add("id_token", response.getIDToken() == null ? null : response.getIDToken().serialize())
.add("code", response.getAuthorizationCode())
.toString();
}
diff --git a/oidc-common-profile-impl/src/test/java/net/shibboleth/oidc/profile/decoding/impl/HTTPPostAuthnResponseDecoderTest.java b/oidc-common-profile-impl/src/test/java/net/shibboleth/oidc/profile/decoding/impl/HTTPPostAuthnResponseDecoderTest.java
index a0e422c1..c513d322 100644
--- a/oidc-common-profile-impl/src/test/java/net/shibboleth/oidc/profile/decoding/impl/HTTPPostAuthnResponseDecoderTest.java
+++ b/oidc-common-profile-impl/src/test/java/net/shibboleth/oidc/profile/decoding/impl/HTTPPostAuthnResponseDecoderTest.java
@@ -18,6 +18,11 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Date;
+import java.util.List;
+
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.messaging.decoder.MessageDecodingException;
import org.springframework.mock.web.MockHttpServletRequest;
@@ -25,6 +30,8 @@ import org.springframework.mock.web.MockHttpServletResponse;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import com.nimbusds.jwt.JWTClaimsSet;
+import com.nimbusds.jwt.PlainJWT;
import com.nimbusds.openid.connect.sdk.AuthenticationErrorResponse;
import com.nimbusds.openid.connect.sdk.AuthenticationResponse;
import com.nimbusds.openid.connect.sdk.AuthenticationSuccessResponse;
@@ -68,6 +75,48 @@ public class HTTPPostAuthnResponseDecoderTest {
assertTrue(((AuthenticationSuccessResponse) msg).getAuthorizationCode().getValue().equals("XSpej7DkB2WYcF1Gzth5CCHw6Oxf3gxR"));
}
+ @SuppressWarnings("null")
+ @Test
+ public void testSuccessfulDecoding_Query_Implicit() throws Exception {
+ final PlainJWT idToken = new PlainJWT(new JWTClaimsSet.Builder().subject("joe")
+ .issuer("https://op.example.com")
+ .audience(List.of("https://rp.example.com"))
+ .issueTime(Date.from(Instant.now()))
+ .expirationTime(Date.from(Instant.now().plus(Duration.ofSeconds(10))))
+ .claim("given_name", "Joe")
+ .build());
+
+ final var idTokenSerialised = idToken.serialize();
+
+ mockRequest.setMethod("POST");
+ mockRequest.setRequestURI("/idp/profile/Authn/OIDC/RP/callback");
+ mockRequest.addParameter("state", "91c28622815dd9a92ef7c984c74c9e39.65317332");
+ mockRequest.addParameter("code", "XSpej7DkB2WYcF1Gzth5CCHw6Oxf3gxR");
+ mockRequest.addParameter("id_token", idTokenSerialised);
+ mockRequest.addParameter("access_token", "access_token_value");
+ mockRequest.addParameter("token_type", "Bearer");
+ mockRequest.setContentType("application/x-www-form-urlencoded");
+ decoder.setHttpServletRequestSupplier(new ThreadLocalHttpServletRequestSupplier());
+ decoder.initialize();
+ decoder.decode();
+
+ final MessageContext mc = decoder.getMessageContext();
+ assert mc != null;
+
+ final Object msg = mc.getMessage();
+ assertTrue(msg instanceof AuthenticationSuccessResponse);
+ assert msg != null;
+ assertTrue(((AuthenticationResponse) msg).getState().getValue().equals("91c28622815dd9a92ef7c984c74c9e39.65317332"));
+ assertTrue(((AuthenticationSuccessResponse) msg).getAuthorizationCode().getValue().equals("XSpej7DkB2WYcF1Gzth5CCHw6Oxf3gxR"));
+ final String logMessage = decoder.serializeMessageForLogging(msg);
+ assertNotNull(logMessage);
+ assertTrue(logMessage.contains("access_token"));
+ assertTrue(logMessage.contains("code"));
+ assertTrue(logMessage.contains("token_type"));
+ assertTrue(logMessage.contains("id_token"));
+ assertTrue(logMessage.contains("state"));
+ }
+
@Test
public void testErrorResponseDecoding() throws Exception {
mockRequest.setMethod("POST");
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list