[java-idp-oidc] 01/02: JOIDC-171 - Support unregistered client policies in userinfo/token/introspection/revocation

Henri Mikkonen henri.mikkonen at iki.fi
Tue Sep 5 10:25:08 UTC 2023


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=a073ec8f2e00676513cca94c265622f32363b551

commit a073ec8f2e00676513cca94c265622f32363b551
Author: Henri Mikkonen <henri.mikkonen at iki.fi>
AuthorDate: Tue Sep 5 12:56:56 2023 +0300

    JOIDC-171 - Support unregistered client policies in userinfo/token/introspection/revocation
    
    https://shibboleth.atlassian.net/browse/JOIDC-171
    
    Added client ID validation against policy to the userinfo endpoint. The validation is done if
    metadata was not resolved to the requesting RP.
---
 .../idp/flows/oidc/userinfo/userinfo-beans.xml     |  5 ++++
 .../idp/flows/oidc/userinfo/userinfo-flow.xml      |  1 +
 .../plugin/oidc/op/profile/flow/UserInfoTest.java  | 32 +++++++++++++++++++++-
 .../shibboleth/idp/module/conf/relying-party.xml   |  1 +
 4 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-beans.xml b/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-beans.xml
index 2e9e1890..e5346a37 100644
--- a/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-beans.xml
+++ b/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-beans.xml
@@ -39,6 +39,11 @@
     <bean id="RelyingPartyCredentialResolver" class="net.shibboleth.profile.relyingparty.RelyingPartyCredentialResolver" 
         c:_0-ref="shibboleth.RelyingPartyResolverService" />
 
+    <bean id="ValidateClientIDAgainstPolicy"
+        class="net.shibboleth.idp.plugin.oidc.op.oauth2.profile.impl.ValidateClientIDAgainstPolicy"
+        p:clientIDLookupStrategy-ref="shibboleth.ClientIDLookupStrategy"
+        scope="prototype" />
+
     <bean id="ValidateAccessToken"
         class="net.shibboleth.idp.plugin.oidc.op.userinfo.profile.impl.ValidateAccessToken" scope="prototype" />
         
diff --git a/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-flow.xml b/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-flow.xml
index f488146d..64dc7fb2 100644
--- a/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-flow.xml
+++ b/idp-oidc-extension-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/oidc/userinfo/userinfo-flow.xml
@@ -44,6 +44,7 @@
     </subflow-state>
 
     <action-state id="OutboundContextsAndSecurityParameters">
+        <evaluate expression="ValidateClientIDAgainstPolicy" />
         <evaluate expression="ValidateAccessToken" />
         <evaluate expression="ValidateScope" />
         <evaluate expression="SetRequestedClaimsToResponseContext" />
diff --git a/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/UserInfoTest.java b/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/UserInfoTest.java
index 277aa54a..5e8a830d 100644
--- a/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/UserInfoTest.java
+++ b/idp-oidc-extension-impl/src/test/java/net/shibboleth/idp/plugin/oidc/op/profile/flow/UserInfoTest.java
@@ -105,7 +105,37 @@ public class UserInfoTest extends AbstractOidcApiFlowTest {
         final BearerAccessToken token = buildToken(idGenerator.generateIdentifier(), subject, new Scope());
         request.addHeader("Authorization", token.toAuthorizationHeader());
         final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
-        assertErrorCode(result, OAuth2Error.UNAUTHORIZED_CLIENT_CODE);
+        assertErrorCode(result, OAuth2Error.ACCESS_DENIED_CODE);
+    }
+
+    @Test
+    public void testSuccesUntrustedClient_policyCompliant_onlySubject() throws URISyntaxException, NoSuchAlgorithmException, DataSealerException,
+        ComponentInitializationException {
+        final BearerAccessToken token = buildToken("policyAcceptedClient1", subject, new Scope("openid"));
+        request.addHeader("Authorization", token.toAuthorizationHeader());
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        final UserInfoSuccessResponse response = parseSuccessResponse(result, UserInfoSuccessResponse.class);
+        Assert.assertEquals(response.getUserInfo().getSubject().getValue(), subject);
+        final UserInfo userInfo = response.getUserInfo();
+        Assert.assertNotNull(userInfo);
+        Assert.assertNull(userInfo.getEmailAddress());
+        Assert.assertNull(userInfo.getNickname());
+        Assert.assertNull(response.getUserInfoJWT());
+    }
+
+    @Test
+    public void testSuccesUntrustedClient_policyCompliant_profileEmailFilteredOut() throws URISyntaxException, NoSuchAlgorithmException, DataSealerException,
+        ComponentInitializationException {
+        final BearerAccessToken token = buildToken("policyAcceptedClient1", subject, new Scope("openid profile email"));
+        request.addHeader("Authorization", token.toAuthorizationHeader());
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        final UserInfoSuccessResponse response = parseSuccessResponse(result, UserInfoSuccessResponse.class);
+        Assert.assertEquals(response.getUserInfo().getSubject().getValue(), subject);
+        final UserInfo userInfo = response.getUserInfo();
+        Assert.assertNotNull(userInfo);
+        Assert.assertNull(userInfo.getEmailAddress());
+        Assert.assertNull(userInfo.getNickname());
+        Assert.assertNull(response.getUserInfoJWT());
     }
 
     @Test
diff --git a/idp-oidc-extension-impl/src/test/resources/net/shibboleth/idp/module/conf/relying-party.xml b/idp-oidc-extension-impl/src/test/resources/net/shibboleth/idp/module/conf/relying-party.xml
index 5ee364ce..55a74f2a 100644
--- a/idp-oidc-extension-impl/src/test/resources/net/shibboleth/idp/module/conf/relying-party.xml
+++ b/idp-oidc-extension-impl/src/test/resources/net/shibboleth/idp/module/conf/relying-party.xml
@@ -42,6 +42,7 @@
                 <bean parent="OIDC.SSO" p:unregisteredClientPolicyLookupStrategy-ref="shibboleth.oidc.DefaultUnregisteredPolicyLookupStrategy"/>
                 <bean parent="OAUTH2.Token" p:unregisteredClientPolicyLookupStrategy-ref="shibboleth.oidc.DefaultUnregisteredPolicyLookupStrategy"/>
                 <bean parent="OAUTH2.TokenAudience" p:encryptionOptional="true" /> 
+                <bean parent="OIDC.UserInfo" p:unregisteredClientPolicyLookupStrategy-ref="shibboleth.oidc.DefaultUnregisteredPolicyLookupStrategy"/>
                 <ref bean="OAUTH2.Introspection" />
                 <ref bean="OAUTH2.Revocation" />
             </list>

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


More information about the commits mailing list