Skip to content

Commit ee689fb

Browse files
committed
ATO-2559: Use feature flag in ClientSecretPostClientAuthValidator
1 parent 64aae42 commit ee689fb

5 files changed

Lines changed: 35 additions & 12 deletions

File tree

oidc-api/src/main/java/uk/gov/di/authentication/oidc/lambda/TokenHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ public TokenHandler(ConfigurationService configurationService) {
137137
this.tokenClientAuthValidatorFactory =
138138
new TokenClientAuthValidatorFactory(
139139
new DynamoClientService(configurationService),
140-
new ClientSignatureValidationService(configurationService));
140+
new ClientSignatureValidationService(configurationService),
141+
configurationService);
141142
this.metrics = new Metrics(configurationService);
142143
this.auditService = new AuditService(configurationService);
143144
}

orchestration-shared/src/main/java/uk/gov/di/orchestration/shared/validation/ClientSecretPostClientAuthValidator.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import uk.gov.di.orchestration.shared.entity.ClientRegistry;
1010
import uk.gov.di.orchestration.shared.exceptions.TokenAuthInvalidException;
1111
import uk.gov.di.orchestration.shared.helpers.Argon2MatcherHelper;
12+
import uk.gov.di.orchestration.shared.services.ConfigurationService;
1213
import uk.gov.di.orchestration.shared.services.DynamoClientService;
1314

1415
import java.util.Map;
@@ -17,11 +18,16 @@
1718
import static uk.gov.di.orchestration.shared.helpers.InstrumentationHelper.addAnnotation;
1819
import static uk.gov.di.orchestration.shared.helpers.LogLineHelper.LogFieldName.CLIENT_ID;
1920
import static uk.gov.di.orchestration.shared.helpers.LogLineHelper.attachLogFieldToLogs;
21+
import static uk.gov.di.orchestration.shared.utils.ClientUtils.getTokenAuthMethodOrDefault;
2022

2123
public class ClientSecretPostClientAuthValidator extends TokenClientAuthValidator {
2224

23-
public ClientSecretPostClientAuthValidator(DynamoClientService dynamoClientService) {
25+
private final ConfigurationService configurationService;
26+
27+
public ClientSecretPostClientAuthValidator(
28+
DynamoClientService dynamoClientService, ConfigurationService configurationService) {
2429
super(dynamoClientService);
30+
this.configurationService = configurationService;
2531
}
2632

2733
@Override
@@ -56,10 +62,10 @@ public ClientRegistry validateTokenAuthAndReturnClientRegistryIfValid(
5662

5763
private void validateTokenAuthMethod(ClientRegistry clientRegistry)
5864
throws TokenAuthInvalidException {
59-
if (Objects.isNull(clientRegistry.getTokenAuthMethod())
60-
|| !clientRegistry
61-
.getTokenAuthMethod()
62-
.equals(ClientAuthenticationMethod.CLIENT_SECRET_POST.getValue())) {
65+
var tokenAuthMethod = getTokenAuthMethodOrDefault(clientRegistry, configurationService);
66+
if (Objects.isNull(tokenAuthMethod)
67+
|| !tokenAuthMethod.equals(
68+
ClientAuthenticationMethod.CLIENT_SECRET_POST.getValue())) {
6369
LOG.warn("Client is not registered to use client_secret_post");
6470
throw generateExceptionWithInvalidClientCode(
6571
"Client is not registered to use client_secret_post",

orchestration-shared/src/main/java/uk/gov/di/orchestration/shared/validation/TokenClientAuthValidatorFactory.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.apache.logging.log4j.LogManager;
44
import org.apache.logging.log4j.Logger;
55
import uk.gov.di.orchestration.shared.services.ClientSignatureValidationService;
6+
import uk.gov.di.orchestration.shared.services.ConfigurationService;
67
import uk.gov.di.orchestration.shared.services.DynamoClientService;
78

89
import java.util.Map;
@@ -12,13 +13,16 @@
1213
public class TokenClientAuthValidatorFactory {
1314
private final DynamoClientService dynamoClientService;
1415
private final ClientSignatureValidationService clientSignatureValidationService;
16+
private final ConfigurationService configurationService;
1517
private static final Logger LOG = LogManager.getLogger(TokenClientAuthValidatorFactory.class);
1618

1719
public TokenClientAuthValidatorFactory(
1820
DynamoClientService dynamoClientService,
19-
ClientSignatureValidationService clientSignatureValidationService) {
21+
ClientSignatureValidationService clientSignatureValidationService,
22+
ConfigurationService configurationService) {
2023
this.clientSignatureValidationService = clientSignatureValidationService;
2124
this.dynamoClientService = dynamoClientService;
25+
this.configurationService = configurationService;
2226
}
2327

2428
public Optional<TokenClientAuthValidator> getTokenAuthenticationValidator(
@@ -36,7 +40,9 @@ public Optional<TokenClientAuthValidator> getTokenAuthenticationValidator(
3640

3741
if (requestBody.containsKey("client_secret") && requestBody.containsKey("client_id")) {
3842
LOG.info("Client auth method is: client_secret_post");
39-
return Optional.of(new ClientSecretPostClientAuthValidator(dynamoClientService));
43+
return Optional.of(
44+
new ClientSecretPostClientAuthValidator(
45+
dynamoClientService, configurationService));
4046
}
4147
return Optional.empty();
4248
}

orchestration-shared/src/test/java/uk/gov/di/orchestration/shared/validation/ClientSecretPostClientAuthValidatorTest.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
import com.nimbusds.oauth2.sdk.util.URLUtils;
1010
import org.junit.jupiter.api.BeforeEach;
1111
import org.junit.jupiter.api.Test;
12+
import org.junit.jupiter.params.ParameterizedTest;
13+
import org.junit.jupiter.params.provider.ValueSource;
1214
import uk.gov.di.orchestration.shared.entity.ClientRegistry;
1315
import uk.gov.di.orchestration.shared.exceptions.TokenAuthInvalidException;
1416
import uk.gov.di.orchestration.shared.helpers.Argon2EncoderHelper;
17+
import uk.gov.di.orchestration.shared.services.ConfigurationService;
1518
import uk.gov.di.orchestration.shared.services.DynamoClientService;
1619

1720
import java.util.Objects;
@@ -30,6 +33,7 @@
3033
class ClientSecretPostClientAuthValidatorTest {
3134

3235
private final DynamoClientService dynamoClientService = mock(DynamoClientService.class);
36+
private final ConfigurationService configurationService = mock(ConfigurationService.class);
3337
private ClientSecretPostClientAuthValidator clientSecretPostClientAuthValidator;
3438

3539
private static final ClientID CLIENT_ID = new ClientID();
@@ -38,7 +42,7 @@ class ClientSecretPostClientAuthValidatorTest {
3842
@BeforeEach
3943
void setUp() {
4044
clientSecretPostClientAuthValidator =
41-
new ClientSecretPostClientAuthValidator(dynamoClientService);
45+
new ClientSecretPostClientAuthValidator(dynamoClientService, configurationService);
4246
}
4347

4448
@Test
@@ -80,13 +84,17 @@ requestString, emptyMap()),
8084
assertThat(tokenAuthInvalidException.getErrorObject(), equalTo(OAuth2Error.INVALID_CLIENT));
8185
}
8286

83-
@Test
84-
void shouldThrowIfClientRegistryDoesNotSupportClientSecretPost() {
87+
@ParameterizedTest
88+
@ValueSource(booleans = {true, false})
89+
void shouldThrowIfClientRegistryDoesNotSupportClientSecretPost(
90+
boolean useDefaultTokenAuthMethod) {
8591
var expectedClientRegistry =
8692
generateClientRegistry(
8793
null, Argon2EncoderHelper.argon2Hash(CLIENT_SECRET.getValue()));
8894
when(dynamoClientService.getClient(CLIENT_ID.getValue()))
8995
.thenReturn(Optional.of(expectedClientRegistry));
96+
when(configurationService.isUseDefaultTokenAuthMethod())
97+
.thenReturn(useDefaultTokenAuthMethod);
9098
var clientSecretPost = new ClientSecretPost(CLIENT_ID, CLIENT_SECRET);
9199
var requestString = URLUtils.serializeParameters(clientSecretPost.toParameters());
92100

orchestration-shared/src/test/java/uk/gov/di/orchestration/shared/validation/TokenClientAuthValidatorFactoryTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.nimbusds.oauth2.sdk.util.URLUtils;
1212
import org.junit.jupiter.api.Test;
1313
import uk.gov.di.orchestration.shared.services.ClientSignatureValidationService;
14+
import uk.gov.di.orchestration.shared.services.ConfigurationService;
1415
import uk.gov.di.orchestration.shared.services.DynamoClientService;
1516
import uk.gov.di.orchestration.sharedtest.utils.KeyPairUtils;
1617

@@ -23,11 +24,12 @@ class TokenClientAuthValidatorFactoryTest {
2324
private final DynamoClientService dynamoClientService = mock(DynamoClientService.class);
2425
private final ClientSignatureValidationService clientSignatureValidationService =
2526
mock(ClientSignatureValidationService.class);
27+
private final ConfigurationService configurationService = mock(ConfigurationService.class);
2628
private static final ClientID CLIENT_ID = new ClientID();
2729
private static final Secret CLIENT_SECRET = new Secret();
2830
private final TokenClientAuthValidatorFactory tokenClientAuthValidatorFactory =
2931
new TokenClientAuthValidatorFactory(
30-
dynamoClientService, clientSignatureValidationService);
32+
dynamoClientService, clientSignatureValidationService, configurationService);
3133

3234
@Test
3335
void shouldReturnPrivateKeyJwtClientAuthValidator() throws JOSEException {

0 commit comments

Comments
 (0)