@ -317,12 +317,11 @@ public class OidcLogoutAuthenticationProviderTests {
@@ -317,12 +317,11 @@ public class OidcLogoutAuthenticationProviderTests {
}
@Test
public void authenticateWhenInvalid SubThenThrowOAuth2AuthenticationException ( ) {
public void authenticateWhenMissing SubThenThrowOAuth2AuthenticationException ( ) {
TestingAuthenticationToken principal = new TestingAuthenticationToken ( "principal" , "credentials" ) ;
RegisteredClient registeredClient = TestRegisteredClients . registeredClient ( ) . build ( ) ;
OidcIdToken idToken = OidcIdToken . withTokenValue ( "id-token" )
. issuer ( "https://provider.com" )
. subject ( "other-sub" )
. audience ( Collections . singleton ( registeredClient . getClientId ( ) ) )
. issuedAt ( Instant . now ( ) . minusSeconds ( 60 ) . truncatedTo ( ChronoUnit . MILLIS ) )
. expiresAt ( Instant . now ( ) . plusSeconds ( 60 ) . truncatedTo ( ChronoUnit . MILLIS ) )
@ -355,6 +354,49 @@ public class OidcLogoutAuthenticationProviderTests {
@@ -355,6 +354,49 @@ public class OidcLogoutAuthenticationProviderTests {
eq ( authorization . getRegisteredClientId ( ) ) ) ;
}
// gh-1235
@Test
public void authenticateWhenInvalidPrincipalThenThrowOAuth2AuthenticationException ( ) {
TestingAuthenticationToken principal = new TestingAuthenticationToken ( "principal" , "credentials" ) ;
RegisteredClient registeredClient = TestRegisteredClients . registeredClient ( ) . build ( ) ;
OidcIdToken idToken = OidcIdToken . withTokenValue ( "id-token" )
. issuer ( "https://provider.com" )
. subject ( principal . getName ( ) )
. audience ( Collections . singleton ( registeredClient . getClientId ( ) ) )
. issuedAt ( Instant . now ( ) . minusSeconds ( 60 ) . truncatedTo ( ChronoUnit . MILLIS ) )
. expiresAt ( Instant . now ( ) . plusSeconds ( 60 ) . truncatedTo ( ChronoUnit . MILLIS ) )
. build ( ) ;
OAuth2Authorization authorization = TestOAuth2Authorizations . authorization ( registeredClient )
. principalName ( principal . getName ( ) )
. token ( idToken ,
( metadata ) - > metadata . put ( OAuth2Authorization . Token . CLAIMS_METADATA_NAME , idToken . getClaims ( ) ) )
. build ( ) ;
when ( this . authorizationService . findByToken ( eq ( idToken . getTokenValue ( ) ) , eq ( ID_TOKEN_TOKEN_TYPE ) ) )
. thenReturn ( authorization ) ;
when ( this . registeredClientRepository . findById ( eq ( authorization . getRegisteredClientId ( ) ) ) )
. thenReturn ( registeredClient ) ;
principal . setAuthenticated ( true ) ;
TestingAuthenticationToken otherPrincipal = new TestingAuthenticationToken ( "other-principal" , "credentials" ) ;
otherPrincipal . setAuthenticated ( true ) ;
OidcLogoutAuthenticationToken authentication = new OidcLogoutAuthenticationToken (
idToken . getTokenValue ( ) , otherPrincipal , "session-1" , null , null , null ) ;
assertThatThrownBy ( ( ) - > this . authenticationProvider . authenticate ( authentication ) )
. isInstanceOf ( OAuth2AuthenticationException . class )
. extracting ( ex - > ( ( OAuth2AuthenticationException ) ex ) . getError ( ) )
. satisfies ( error - > {
assertThat ( error . getErrorCode ( ) ) . isEqualTo ( OAuth2ErrorCodes . INVALID_TOKEN ) ;
assertThat ( error . getDescription ( ) ) . contains ( "sub" ) ;
} ) ;
verify ( this . authorizationService ) . findByToken (
eq ( authentication . getIdTokenHint ( ) ) , eq ( ID_TOKEN_TOKEN_TYPE ) ) ;
verify ( this . registeredClientRepository ) . findById (
eq ( authorization . getRegisteredClientId ( ) ) ) ;
}
@Test
public void authenticateWhenMissingSidThenThrowOAuth2AuthenticationException ( ) {
TestingAuthenticationToken principal = new TestingAuthenticationToken ( "principal" , "credentials" ) ;