Skip to content

Commit 0c4dcf5

Browse files
committed
Merge branch '1.0.x' into 1.1.x
Closes gh-1383
2 parents f4e67f3 + 88447bd commit 0c4dcf5

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/authentication/OidcClientRegistrationAuthenticationProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ private OidcClientRegistrationAuthenticationToken registerClient(OidcClientRegis
211211
.clientSecret(this.passwordEncoder.encode(registeredClient.getClientSecret()))
212212
.build();
213213
this.registeredClientRepository.save(updatedRegisteredClient);
214+
if (ClientAuthenticationMethod.CLIENT_SECRET_JWT.getValue().equals(clientRegistrationAuthentication.getClientRegistration().getTokenEndpointAuthenticationMethod())) {
215+
// gh-1344 Return the hashed client_secret
216+
registeredClient = updatedRegisteredClient;
217+
}
214218
} else {
215219
this.registeredClientRepository.save(registeredClient);
216220
}

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/config/annotation/web/configurers/OidcClientRegistrationTests.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.util.UUID;
2424
import java.util.function.Consumer;
2525

26+
import javax.crypto.spec.SecretKeySpec;
27+
2628
import com.nimbusds.jose.jwk.JWKSet;
2729
import com.nimbusds.jose.jwk.source.JWKSource;
2830
import com.nimbusds.jose.proc.SecurityContext;
@@ -406,6 +408,55 @@ public void requestWhenClientRegistersWithSecretThenClientAuthenticationSuccess(
406408
.andReturn();
407409
}
408410

411+
// gh-1344
412+
@Test
413+
public void requestWhenClientRegistersWithClientSecretJwtThenClientAuthenticationSuccess() throws Exception {
414+
this.spring.register(AuthorizationServerConfiguration.class).autowire();
415+
416+
// @formatter:off
417+
OidcClientRegistration clientRegistration = OidcClientRegistration.builder()
418+
.clientName("client-name")
419+
.redirectUri("https://client.example.com")
420+
.grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())
421+
.grantType(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue())
422+
.tokenEndpointAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_JWT.getValue())
423+
.scope("scope1")
424+
.scope("scope2")
425+
.build();
426+
// @formatter:on
427+
428+
OidcClientRegistration clientRegistrationResponse = registerClient(clientRegistration);
429+
430+
JwsHeader jwsHeader = JwsHeader.with(MacAlgorithm.HS256)
431+
.build();
432+
433+
Instant issuedAt = Instant.now();
434+
Instant expiresAt = issuedAt.plus(1, ChronoUnit.HOURS);
435+
JwtClaimsSet jwtClaimsSet = JwtClaimsSet.builder()
436+
.issuer(clientRegistrationResponse.getClientId())
437+
.subject(clientRegistrationResponse.getClientId())
438+
.audience(Collections.singletonList(asUrl(this.authorizationServerSettings.getIssuer(), this.authorizationServerSettings.getTokenEndpoint())))
439+
.issuedAt(issuedAt)
440+
.expiresAt(expiresAt)
441+
.build();
442+
443+
JWKSet jwkSet = new JWKSet(TestJwks.jwk(
444+
new SecretKeySpec(clientRegistrationResponse.getClientSecret().getBytes(), "HS256")).build());
445+
JwtEncoder jwtClientAssertionEncoder = new NimbusJwtEncoder((jwkSelector, securityContext) -> jwkSelector.select(jwkSet));
446+
447+
Jwt jwtAssertion = jwtClientAssertionEncoder.encode(JwtEncoderParameters.from(jwsHeader, jwtClaimsSet));
448+
449+
this.mvc.perform(post(DEFAULT_TOKEN_ENDPOINT_URI)
450+
.param(OAuth2ParameterNames.GRANT_TYPE, AuthorizationGrantType.CLIENT_CREDENTIALS.getValue())
451+
.param(OAuth2ParameterNames.SCOPE, "scope1")
452+
.param(OAuth2ParameterNames.CLIENT_ASSERTION_TYPE, "urn:ietf:params:oauth:client-assertion-type:jwt-bearer")
453+
.param(OAuth2ParameterNames.CLIENT_ASSERTION, jwtAssertion.getTokenValue())
454+
.param(OAuth2ParameterNames.CLIENT_ID, clientRegistrationResponse.getClientId()))
455+
.andExpect(status().isOk())
456+
.andExpect(jsonPath("$.access_token").isNotEmpty())
457+
.andExpect(jsonPath("$.scope").value("scope1"));
458+
}
459+
409460
@Test
410461
public void requestWhenClientRegistersWithCustomMetadataThenSavedToRegisteredClient() throws Exception {
411462
this.spring.register(CustomClientMetadataConfiguration.class).autowire();

0 commit comments

Comments
 (0)