From 415983bb9385d5c90bce4a605162e225c946149b Mon Sep 17 00:00:00 2001 From: strehle Date: Thu, 24 Aug 2023 17:07:33 +0200 Subject: [PATCH] Refactoring because of usage of client_jwt_config now from oauth_client_details additional_information is not used anymore --- .../uaa/oauth/client/ClientConstants.java | 1 - .../uaa/client/ClientAdminBootstrap.java | 31 +++++++++-------- .../uaa/client/ClientAdminEndpoints.java | 8 ++--- .../uaa/client/ClientJwtConfiguration.java | 34 +++++++------------ .../MultitenantJdbcClientDetailsService.java | 18 +++++----- .../uaa/client/ClientAdminBootstrapTests.java | 26 +++++++------- .../uaa/client/ClientAdminEndpointsTests.java | 12 +++---- .../client/ClientJwtConfigurationTest.java | 21 +++++------- 8 files changed, 69 insertions(+), 82 deletions(-) diff --git a/model/src/main/java/org/cloudfoundry/identity/uaa/oauth/client/ClientConstants.java b/model/src/main/java/org/cloudfoundry/identity/uaa/oauth/client/ClientConstants.java index 6cc4dde5cc9..79d333b8da5 100644 --- a/model/src/main/java/org/cloudfoundry/identity/uaa/oauth/client/ClientConstants.java +++ b/model/src/main/java/org/cloudfoundry/identity/uaa/oauth/client/ClientConstants.java @@ -21,6 +21,5 @@ public class ClientConstants { public static final String APPROVALS_DELETED = "approvals_deleted"; public static final String TOKEN_SALT = "token_salt"; public static final String REQUIRED_USER_GROUPS = "required_user_groups"; - public static final String PRIVATE_KEY_CONFIG = "private_key_config"; public static final String LAST_MODIFIED = "lastModified"; } diff --git a/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrap.java b/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrap.java index 598bd38845c..dcd5783c363 100644 --- a/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrap.java +++ b/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrap.java @@ -159,7 +159,7 @@ private void addNewClients() { if (map.get("authorized-grant-types") == null) { throw new InvalidClientDetailsException("Client must have at least one authorized-grant-type. client ID: " + clientId); } - BaseClientDetails client = new BaseClientDetails(clientId, (String) map.get("resource-ids"), + UaaClientDetails client = new UaaClientDetails(clientId, (String) map.get("resource-ids"), (String) map.get("scope"), (String) map.get("authorized-grant-types"), (String) map.get("authorities"), getRedirectUris(map)); @@ -210,6 +210,21 @@ private void addNewClients() { } client.setAdditionalInformation(info); + + if (map.get("jwks_uri") instanceof String) { + String jwksUri = (String) map.get("jwks_uri"); + ClientJwtConfiguration keyConfig = ClientJwtConfiguration.parse(UaaUrlUtils.normalizeUri(jwksUri), null); + if (keyConfig != null && keyConfig.getCleanString() != null) { + keyConfig.writeValue(client); + } + } else if (map.get("jwks") instanceof String) { + String jwks = (String) map.get("jwks"); + ClientJwtConfiguration keyConfig = ClientJwtConfiguration.parse(null, jwks); + if (keyConfig != null && keyConfig.getCleanString() != null) { + keyConfig.writeValue(client); + } + } + try { clientRegistrationService.addClientDetails(client, IdentityZone.getUaaZoneId()); if (secondSecret != null) { @@ -236,20 +251,6 @@ private void addNewClients() { } } - if (map.get("jwks_uri") instanceof String) { - String jwksUri = (String) map.get("jwks_uri"); - ClientJwtConfiguration keyConfig = ClientJwtConfiguration.parse(UaaUrlUtils.normalizeUri(jwksUri), null); - if (keyConfig != null && keyConfig.getCleanString() != null) { - clientRegistrationService.addClientJwtConfig(clientId, keyConfig.getJwksUri(), IdentityZone.getUaaZoneId(), override); - } - } else if (map.get("jwks") instanceof String) { - String jwks = (String) map.get("jwks"); - ClientJwtConfiguration keyConfig = ClientJwtConfiguration.parse(null, jwks); - if (keyConfig != null && keyConfig.getCleanString() != null) { - clientRegistrationService.addClientJwtConfig(clientId, keyConfig.getCleanString(), IdentityZone.getUaaZoneId(), override); - } - } - ClientMetadata clientMetadata = buildClientMetadata(map, clientId); clientMetadataProvisioning.update(clientMetadata, IdentityZone.getUaaZoneId()); } diff --git a/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpoints.java b/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpoints.java index 9b3d8b14062..6d52740e88a 100644 --- a/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpoints.java +++ b/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpoints.java @@ -540,20 +540,20 @@ public ActionResult changeSecret(@PathVariable String client_id, @RequestBody Se @ResponseBody public ActionResult changeClientJwt(@PathVariable String client_id, @RequestBody ClientJwtChangeRequest change) { - ClientDetails clientDetails; + UaaClientDetails uaaClientDetails; try { - clientDetails = clientDetailsService.retrieve(client_id, IdentityZoneHolder.get().getId()); + uaaClientDetails = (UaaClientDetails) clientDetailsService.retrieve(client_id, IdentityZoneHolder.get().getId()); } catch (InvalidClientException e) { throw new NoSuchClientException("No such client: " + client_id); } try { - checkPasswordChangeIsAllowed(clientDetails, ""); + checkPasswordChangeIsAllowed(uaaClientDetails, ""); } catch (IllegalStateException e) { throw new InvalidClientDetailsException(e.getMessage()); } - ClientJwtConfiguration clientKeyConfig = ClientJwtConfiguration.readValue(clientDetails); + ClientJwtConfiguration clientKeyConfig = ClientJwtConfiguration.readValue(uaaClientDetails); ActionResult result; switch (change.getChangeMode()){ diff --git a/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfiguration.java b/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfiguration.java index dd664c8b842..78e8c318737 100644 --- a/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfiguration.java +++ b/server/src/main/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfiguration.java @@ -12,7 +12,6 @@ import org.cloudfoundry.identity.uaa.util.JsonUtils; import org.cloudfoundry.identity.uaa.util.UaaUrlUtils; import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.client.BaseClientDetails; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -23,12 +22,9 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import static org.cloudfoundry.identity.uaa.oauth.client.ClientConstants.PRIVATE_KEY_CONFIG; - @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class ClientJwtConfiguration implements Cloneable{ @@ -186,52 +182,48 @@ private boolean validateJwksUri() { /** * Creator from ClientDetails. Should abstract the persistence. - * Use currently the additional information entry + * Use currently the client_jwt_config in UaaClientDetails * * @param clientDetails * @return */ @JsonIgnore - public static ClientJwtConfiguration readValue(ClientDetails clientDetails) { + public static ClientJwtConfiguration readValue(UaaClientDetails clientDetails) { if (clientDetails == null || - clientDetails.getAdditionalInformation() == null || - !(clientDetails.getAdditionalInformation().get(PRIVATE_KEY_CONFIG) instanceof String)) { + clientDetails.getClientJwtConfig() == null || + !(clientDetails.getClientJwtConfig() instanceof String)) { return null; } - return JsonUtils.readValue((String) clientDetails.getAdditionalInformation().get(PRIVATE_KEY_CONFIG), ClientJwtConfiguration.class); + return JsonUtils.readValue((String) clientDetails.getClientJwtConfig(), ClientJwtConfiguration.class); } /** * Creator from ClientDetails. Should abstract the persistence. - * Use currently the additional information entry + * Use currently the client_jwt_config in UaaClientDetails * * @param clientDetails * @return */ @JsonIgnore public void writeValue(ClientDetails clientDetails) { - if (clientDetails instanceof BaseClientDetails) { - BaseClientDetails baseClientDetails = (BaseClientDetails) clientDetails; - HashMap additionalInformation = Optional.ofNullable(baseClientDetails.getAdditionalInformation()).map(HashMap::new).orElse(new HashMap<>()); - additionalInformation.put(PRIVATE_KEY_CONFIG, JsonUtils.writeValueAsString(this)); - baseClientDetails.setAdditionalInformation(additionalInformation); + if (clientDetails instanceof UaaClientDetails) { + UaaClientDetails uaaClientDetails = (UaaClientDetails) clientDetails; + uaaClientDetails.setClientJwtConfig(JsonUtils.writeValueAsString(this)); } } /** * Cleanup configuration in ClientDetails. Should abstract the persistence. - * Use currently the additional information entry + * Use currently the client_jwt_config in UaaClientDetails * * @param clientDetails * @return */ @JsonIgnore public static void resetConfiguration(ClientDetails clientDetails) { - if (clientDetails instanceof BaseClientDetails) { - BaseClientDetails baseClientDetails = (BaseClientDetails) clientDetails; - HashMap additionalInformation = Optional.ofNullable(baseClientDetails.getAdditionalInformation()).map(HashMap::new).orElse(new HashMap<>()); - additionalInformation.remove(PRIVATE_KEY_CONFIG); - baseClientDetails.setAdditionalInformation(additionalInformation); + if (clientDetails instanceof UaaClientDetails) { + UaaClientDetails uaaClientDetails = (UaaClientDetails) clientDetails; + uaaClientDetails.setClientJwtConfig(null); } } diff --git a/server/src/main/java/org/cloudfoundry/identity/uaa/zone/MultitenantJdbcClientDetailsService.java b/server/src/main/java/org/cloudfoundry/identity/uaa/zone/MultitenantJdbcClientDetailsService.java index 1869b094a3d..ed3fe82ebe6 100644 --- a/server/src/main/java/org/cloudfoundry/identity/uaa/zone/MultitenantJdbcClientDetailsService.java +++ b/server/src/main/java/org/cloudfoundry/identity/uaa/zone/MultitenantJdbcClientDetailsService.java @@ -303,13 +303,13 @@ public void deleteClientSecret(String clientId, String zoneId) throws NoSuchClie public void addClientJwtConfig(String clientId, String keyConfig, String zoneId, boolean overwrite) throws NoSuchClientException { ClientJwtConfiguration clientJwtConfiguration = ClientJwtConfiguration.parse(keyConfig); if (clientJwtConfiguration != null) { - BaseClientDetails clientDetails = (BaseClientDetails) loadClientByClientId(clientId, zoneId); - ClientJwtConfiguration existingConfig = ClientJwtConfiguration.readValue(clientDetails); + UaaClientDetails uaaClientDetails = (UaaClientDetails) loadClientByClientId(clientId, zoneId); + ClientJwtConfiguration existingConfig = ClientJwtConfiguration.readValue(uaaClientDetails); ClientJwtConfiguration result = ClientJwtConfiguration.merge(existingConfig, clientJwtConfiguration, overwrite); if (result != null) { - result.writeValue(clientDetails); + result.writeValue(uaaClientDetails); } - updateClientDetails(clientDetails, zoneId); + updateClientDetails(uaaClientDetails, zoneId); } } @@ -322,14 +322,14 @@ public void deleteClientJwtConfig(String clientId, String keyConfig, String zone clientJwtConfiguration = new ClientJwtConfiguration(keyConfig, null); } if (clientJwtConfiguration != null) { - BaseClientDetails clientDetails = (BaseClientDetails) loadClientByClientId(clientId, zoneId); - ClientJwtConfiguration result = ClientJwtConfiguration.delete(ClientJwtConfiguration.readValue(clientDetails), clientJwtConfiguration); + UaaClientDetails uaaClientDetails = (UaaClientDetails) loadClientByClientId(clientId, zoneId); + ClientJwtConfiguration result = ClientJwtConfiguration.delete(ClientJwtConfiguration.readValue(uaaClientDetails), clientJwtConfiguration); if (result != null) { - result.writeValue(clientDetails); + result.writeValue(uaaClientDetails); } else { - ClientJwtConfiguration.resetConfiguration(clientDetails); + ClientJwtConfiguration.resetConfiguration(uaaClientDetails); } - updateClientDetails(clientDetails, zoneId); + updateClientDetails(uaaClientDetails, zoneId); } } diff --git a/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrapTests.java b/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrapTests.java index 7e77098a1c3..fb2c063dca4 100644 --- a/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrapTests.java +++ b/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminBootstrapTests.java @@ -255,29 +255,29 @@ void simpleAddClientWithSignupSuccessRedirectUrl() throws Exception { @Test void simpleAddClientWithJwksUri() throws Exception { Map map = new HashMap<>(); - map.put("id", "foo"); + map.put("id", "foo-jwks-uri"); map.put("secret", "bar"); map.put("scope", "openid"); map.put("authorized-grant-types", GRANT_TYPE_AUTHORIZATION_CODE); map.put("authorities", "uaa.none"); map.put("redirect-uri", "http://localhost/callback"); map.put("jwks_uri", "https://localhost:8080/uaa"); - ClientDetails clientDetails = doSimpleTest(map, clientAdminBootstrap, multitenantJdbcClientDetailsService, clients); - assertNotNull(clientDetails.getAdditionalInformation().get(ClientConstants.PRIVATE_KEY_CONFIG)); + UaaClientDetails clientDetails = (UaaClientDetails) doSimpleTest(map, clientAdminBootstrap, multitenantJdbcClientDetailsService, clients); + assertNotNull(clientDetails.getClientJwtConfig()); } @Test void simpleAddClientWithJwkSet() throws Exception { Map map = new HashMap<>(); - map.put("id", "foo"); + map.put("id", "foo-jwks"); map.put("secret", "bar"); map.put("scope", "openid"); map.put("authorized-grant-types", GRANT_TYPE_AUTHORIZATION_CODE); map.put("authorities", "uaa.none"); map.put("redirect-uri", "http://localhost/callback"); map.put("jwks", "{\"kty\":\"RSA\",\"e\":\"AQAB\",\"kid\":\"key-1\",\"alg\":\"RS256\",\"n\":\"u_A1S-WoVAnHlNQ_1HJmOPBVxIdy1uSNsp5JUF5N4KtOjir9EgG9HhCFRwz48ykEukrgaK4ofyy_wRXSUJKW7Q\"}"); - ClientDetails clientDetails = doSimpleTest(map, clientAdminBootstrap, multitenantJdbcClientDetailsService, clients); - assertNotNull(clientDetails.getAdditionalInformation().get(ClientConstants.PRIVATE_KEY_CONFIG)); + UaaClientDetails clientDetails = (UaaClientDetails) doSimpleTest(map, clientAdminBootstrap, multitenantJdbcClientDetailsService, clients); + assertNotNull(clientDetails.getClientJwtConfig()); } @Test @@ -355,17 +355,17 @@ void setUp() { @Test void simpleAddClientWithAutoApprove() { Map map = createClientMap(autoApproveId); - BaseClientDetails output = new BaseClientDetails(autoApproveId, "none", "openid", "authorization_code,refresh_token", "uaa.none", "http://localhost/callback"); + UaaClientDetails output = new UaaClientDetails(autoApproveId, "none", "openid", "authorization_code,refresh_token", "uaa.none", "http://localhost/callback"); output.setClientSecret("bar"); doReturn(output).when(multitenantJdbcClientDetailsService).loadClientByClientId(eq(autoApproveId), anyString()); clients.put((String) map.get("id"), map); - BaseClientDetails expectedAdd = new BaseClientDetails(output); + UaaClientDetails expectedAdd = new UaaClientDetails(output); clientAdminBootstrap.afterPropertiesSet(); verify(multitenantJdbcClientDetailsService).addClientDetails(expectedAdd, "uaa"); - BaseClientDetails expectedUpdate = new BaseClientDetails(expectedAdd); + UaaClientDetails expectedUpdate = new UaaClientDetails(expectedAdd); expectedUpdate.setAdditionalInformation(Collections.singletonMap(ClientConstants.AUTO_APPROVE, true)); verify(multitenantJdbcClientDetailsService).updateClientDetails(expectedUpdate, "uaa"); } @@ -373,16 +373,16 @@ void simpleAddClientWithAutoApprove() { @Test void simpleAddClientWithAllowPublic() { Map map = createClientMap(allowPublicId); - BaseClientDetails output = new BaseClientDetails(allowPublicId, "none", "openid", "authorization_code,refresh_token", "uaa.none", "http://localhost/callback"); + UaaClientDetails output = new UaaClientDetails(allowPublicId, "none", "openid", "authorization_code,refresh_token", "uaa.none", "http://localhost/callback"); output.setClientSecret("bar"); doReturn(output).when(multitenantJdbcClientDetailsService).loadClientByClientId(eq(allowPublicId), anyString()); clients.put((String) map.get("id"), map); - BaseClientDetails expectedAdd = new BaseClientDetails(output); + UaaClientDetails expectedAdd = new UaaClientDetails(output); clientAdminBootstrap.afterPropertiesSet(); - BaseClientDetails expectedUpdate = new BaseClientDetails(expectedAdd); + UaaClientDetails expectedUpdate = new UaaClientDetails(expectedAdd); expectedUpdate.setAdditionalInformation(Collections.singletonMap(ClientConstants.ALLOW_PUBLIC, true)); verify(multitenantJdbcClientDetailsService, times(1)).updateClientDetails(expectedUpdate, "uaa"); } @@ -390,7 +390,7 @@ void simpleAddClientWithAllowPublic() { @Test void simpleAddClientWithAllowPublicNoClient() { Map map = createClientMap(allowPublicId); - BaseClientDetails output = new BaseClientDetails(allowPublicId, "none", "openid", "authorization_code,refresh_token", "uaa.none", "http://localhost/callback"); + UaaClientDetails output = new UaaClientDetails(allowPublicId, "none", "openid", "authorization_code,refresh_token", "uaa.none", "http://localhost/callback"); output.setClientSecret("bar"); doThrow(new NoSuchClientException(allowPublicId)).when(multitenantJdbcClientDetailsService).loadClientByClientId(eq(allowPublicId), anyString()); diff --git a/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpointsTests.java b/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpointsTests.java index 7099db2a3e6..e9966583362 100644 --- a/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpointsTests.java +++ b/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientAdminEndpointsTests.java @@ -1074,9 +1074,9 @@ void testCreateClientWithJsonWebKeyUri() { createRequest.setJsonWebKeyUri(jwksUri); ClientDetails result = endpoints.createClientDetails(createRequest); assertNull(result.getClientSecret()); - ArgumentCaptor clientCaptor = ArgumentCaptor.forClass(BaseClientDetails.class); + ArgumentCaptor clientCaptor = ArgumentCaptor.forClass(UaaClientDetails.class); verify(clientDetailsService).create(clientCaptor.capture(), anyString()); - BaseClientDetails created = clientCaptor.getValue(); + UaaClientDetails created = clientCaptor.getValue(); assertEquals(ClientJwtConfiguration.readValue(created), ClientJwtConfiguration.parse(jwksUri)); } @@ -1094,9 +1094,9 @@ void testCreateClientWithJsonWebKeyUriInvalid() { createRequest.setJsonWebKeySet(jwksUri); ClientDetails result = endpoints.createClientDetails(createRequest); assertNull(result.getClientSecret()); - ArgumentCaptor clientCaptor = ArgumentCaptor.forClass(BaseClientDetails.class); + ArgumentCaptor clientCaptor = ArgumentCaptor.forClass(UaaClientDetails.class); verify(clientDetailsService).create(clientCaptor.capture(), anyString()); - BaseClientDetails created = clientCaptor.getValue(); + UaaClientDetails created = clientCaptor.getValue(); assertNull(ClientJwtConfiguration.readValue(created)); } @@ -1173,9 +1173,9 @@ void testCreateClientWithJsonKeyWebSet() { createRequest.setJsonWebKeySet(jsonJwk); ClientDetails result = endpoints.createClientDetails(createRequest); assertNull(result.getClientSecret()); - ArgumentCaptor clientCaptor = ArgumentCaptor.forClass(BaseClientDetails.class); + ArgumentCaptor clientCaptor = ArgumentCaptor.forClass(UaaClientDetails.class); verify(clientDetailsService).create(clientCaptor.capture(), anyString()); - BaseClientDetails created = clientCaptor.getValue(); + UaaClientDetails created = clientCaptor.getValue(); assertEquals(ClientJwtConfiguration.readValue(created), ClientJwtConfiguration.parse(jsonJwk)); assertEquals(ClientJwtConfiguration.readValue(created), ClientJwtConfiguration.parse(jsonJwk2)); assertEquals(ClientJwtConfiguration.readValue(created), ClientJwtConfiguration.parse(jsonJwkSet)); diff --git a/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfigurationTest.java b/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfigurationTest.java index 8c61ef6c535..25612e47d72 100644 --- a/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfigurationTest.java +++ b/server/src/test/java/org/cloudfoundry/identity/uaa/client/ClientJwtConfigurationTest.java @@ -1,16 +1,13 @@ package org.cloudfoundry.identity.uaa.client; -import org.cloudfoundry.identity.uaa.oauth.client.ClientConstants; import org.cloudfoundry.identity.uaa.oauth.jwk.JsonWebKey; import org.cloudfoundry.identity.uaa.oauth.jwk.JsonWebKeySet; import org.cloudfoundry.identity.uaa.util.JsonUtils; import org.junit.jupiter.api.Test; -import org.springframework.security.oauth2.provider.client.BaseClientDetails; import java.text.ParseException; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -228,19 +225,17 @@ void testSerializableObjectCalls() throws CloneNotSupportedException { void testConfiguration() { ClientJwtConfiguration configUri = JsonUtils.readValue(defaultJsonUri, ClientJwtConfiguration.class); ClientJwtConfiguration configKey = JsonUtils.readValue(defaultJsonKey, ClientJwtConfiguration.class); - BaseClientDetails baseClientDetails = new BaseClientDetails(); - HashMap additionalInformation = new HashMap<>(); - additionalInformation.put(ClientConstants.PRIVATE_KEY_CONFIG, configUri); - baseClientDetails.setAdditionalInformation(additionalInformation); + UaaClientDetails uaaClientDetails = new UaaClientDetails(); + uaaClientDetails.setClientJwtConfig(JsonUtils.writeValueAsString(configUri)); - configUri.writeValue(baseClientDetails); - ClientJwtConfiguration readUriConfig = ClientJwtConfiguration.readValue(baseClientDetails); + configUri.writeValue(uaaClientDetails); + ClientJwtConfiguration readUriConfig = ClientJwtConfiguration.readValue(uaaClientDetails); assertEquals(configUri, readUriConfig); - ClientJwtConfiguration.resetConfiguration(baseClientDetails); - assertNull(ClientJwtConfiguration.readValue(baseClientDetails)); - configKey.writeValue(baseClientDetails); - ClientJwtConfiguration readKeyConfig = ClientJwtConfiguration.readValue(baseClientDetails); + ClientJwtConfiguration.resetConfiguration(uaaClientDetails); + assertNull(ClientJwtConfiguration.readValue(uaaClientDetails)); + configKey.writeValue(uaaClientDetails); + ClientJwtConfiguration readKeyConfig = ClientJwtConfiguration.readValue(uaaClientDetails); assertEquals(configKey, readKeyConfig); } }