Skip to content

Commit 1b34e2f

Browse files
committed
Merge remote-tracking branch 'origin/pkce-default-config-gh-16391' into pkce-default-config-gh-16391
Signed-off-by: Rohan Naik <[email protected]> # Conflicts: # oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultOAuth2AuthorizationRequestResolverTests.java
2 parents a2c694d + fe08301 commit 1b34e2f

File tree

3 files changed

+26
-45
lines changed

3 files changed

+26
-45
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/ClientRegistration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -756,9 +756,7 @@ public static final class ClientSettings implements Serializable {
756756

757757
private boolean requireProofKey;
758758

759-
private ClientSettings() {
760-
this.requireProofKey = true;
761-
}
759+
private ClientSettings() {}
762760

763761
public boolean isRequireProofKey() {
764762
return this.requireProofKey;
@@ -794,6 +792,7 @@ public static final class Builder {
794792
private boolean requireProofKey;
795793

796794
private Builder() {
795+
this.requireProofKey = true;
797796
}
798797

799798
/**

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/TestClientRegistrations.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public static ClientRegistration.Builder clientRegistration2() {
6464
// @formatter:on
6565
}
6666

67-
private static ClientRegistration.Builder publicClientRegistrationWithNoPkce() {
67+
public static ClientRegistration.Builder publicClientRegistrationWithNoPkce() {
6868
return ClientRegistration.withRegistrationId("no-pkce")
6969
.redirectUri("{baseUrl}/{action}/oauth2/code/{registrationId}")
7070
.clientAuthenticationMethod(ClientAuthenticationMethod.NONE)
@@ -76,6 +76,7 @@ private static ClientRegistration.Builder publicClientRegistrationWithNoPkce() {
7676
.userInfoUri("https://api.example.com/user")
7777
.userNameAttributeName("id")
7878
.clientName("Client Name")
79+
.clientId("client-id")
7980
.clientSecret(null);
8081
}
8182

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultOAuth2AuthorizationRequestResolverTests.java

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void setUp() {
7878
this.registration2 = TestClientRegistrations.clientRegistration2().build();
7979

8080
this.pkceClientRegistration = pkceClientRegistration().build();
81-
81+
this.nonProofKeyPublicClientRegistration = TestClientRegistrations.publicClientRegistrationWithNoPkce().build();
8282
this.fineRedirectUriTemplateRegistration = fineRedirectUriTemplateClientRegistration().build();
8383
// @formatter:off
8484
this.publicClientRegistration = TestClientRegistrations.clientRegistration()
@@ -94,7 +94,7 @@ public void setUp() {
9494
// @formatter:on
9595
this.clientRegistrationRepository = new InMemoryClientRegistrationRepository(this.registration1,
9696
this.registration2, this.pkceClientRegistration, this.fineRedirectUriTemplateRegistration,
97-
this.publicClientRegistration, this.oidcRegistration);
97+
this.publicClientRegistration, this.oidcRegistration,nonProofKeyPublicClientRegistration);
9898
this.resolver = new DefaultOAuth2AuthorizationRequestResolver(this.clientRegistrationRepository,
9999
this.authorizationRequestBaseUri);
100100
}
@@ -176,11 +176,14 @@ public void resolveWhenAuthorizationRequestWithValidClientThenResolves() {
176176
assertThat(authorizationRequest.getAdditionalParameters())
177177
.doesNotContainKey(OAuth2ParameterNames.REGISTRATION_ID);
178178
assertThat(authorizationRequest.getAttributes())
179-
.containsExactly(entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()));
179+
.containsExactly(
180+
entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()),
181+
entry(PkceParameterNames.CODE_VERIFIER, authorizationRequest.getAttributes().get(PkceParameterNames.CODE_VERIFIER))
182+
);
180183
assertThat(authorizationRequest.getAuthorizationRequestUri())
181184
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
182185
+ "scope=read:user&state=.{15,}&"
183-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id");
186+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256");
184187
}
185188

186189
@Test
@@ -193,7 +196,10 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenResolves
193196
clientRegistration.getRegistrationId());
194197
assertThat(authorizationRequest).isNotNull();
195198
assertThat(authorizationRequest.getAttributes())
196-
.containsExactly(entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()));
199+
.containsExactly(
200+
entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()),
201+
entry(PkceParameterNames.CODE_VERIFIER, authorizationRequest.getAttributes().get(PkceParameterNames.CODE_VERIFIER))
202+
);
197203
}
198204

199205
@Test
@@ -301,7 +307,7 @@ public void resolveWhenAuthorizationRequestIncludesPort80ThenExpandedRedirectUri
301307
assertThat(authorizationRequest.getAuthorizationRequestUri())
302308
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
303309
+ "scope=read:user&state=.{15,}&"
304-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id");
310+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id"+ "&code_challenge=.{15,}&code_challenge_method=S256");
305311
}
306312

307313
@Test
@@ -317,7 +323,7 @@ public void resolveWhenAuthorizationRequestIncludesPort443ThenExpandedRedirectUr
317323
assertThat(authorizationRequest.getAuthorizationRequestUri())
318324
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
319325
+ "scope=read:user&state=.{15,}&"
320-
+ "redirect_uri=https://example.com/login/oauth2/code/registration-id");
326+
+ "redirect_uri=https://example.com/login/oauth2/code/registration-id" + "&code_challenge=.{15,}&code_challenge_method=S256");
321327
}
322328

323329
@Test
@@ -331,7 +337,7 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenRedirect
331337
assertThat(authorizationRequest.getAuthorizationRequestUri())
332338
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
333339
+ "scope=read:user&state=.{15,}&"
334-
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id");
340+
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256");
335341
}
336342

337343
@Test
@@ -344,7 +350,7 @@ public void resolveWhenAuthorizationRequestOAuth2LoginThenRedirectUriIsLogin() {
344350
assertThat(authorizationRequest.getAuthorizationRequestUri())
345351
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id-2&"
346352
+ "scope=read:user&state=.{15,}&"
347-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2");
353+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2" + "&code_challenge=.{15,}&code_challenge_method=S256");
348354
}
349355

350356
@Test
@@ -358,7 +364,7 @@ public void resolveWhenAuthorizationRequestHasActionParameterAuthorizeThenRedire
358364
assertThat(authorizationRequest.getAuthorizationRequestUri())
359365
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
360366
+ "scope=read:user&state=.{15,}&"
361-
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id");
367+
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256");
362368
}
363369

364370
@Test
@@ -372,7 +378,7 @@ public void resolveWhenAuthorizationRequestHasActionParameterLoginThenRedirectUr
372378
assertThat(authorizationRequest.getAuthorizationRequestUri())
373379
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id-2&"
374380
+ "scope=read:user&state=.{15,}&"
375-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2");
381+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2&code_challenge=.{15,}&code_challenge_method=S256");
376382
}
377383

378384
@Test
@@ -449,32 +455,6 @@ public void resolveWhenAuthorizationRequestApplyPkceToPublicClientWithRequirePro
449455
}
450456

451457
// gh-6548
452-
@Test
453-
public void resolveWhenAuthorizationRequestApplyPkceToSpecificConfidentialClientThenApplied() {
454-
this.resolver.setAuthorizationRequestCustomizer((builder) -> {
455-
builder.attributes((attrs) -> {
456-
String registrationId = (String) attrs.get(OAuth2ParameterNames.REGISTRATION_ID);
457-
if (this.registration1.getRegistrationId().equals(registrationId)) {
458-
OAuth2AuthorizationRequestCustomizers.withPkce().accept(builder);
459-
}
460-
});
461-
});
462-
463-
ClientRegistration clientRegistration = this.registration1;
464-
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
465-
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
466-
request.setServletPath(requestUri);
467-
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
468-
assertPkceApplied(authorizationRequest, clientRegistration);
469-
470-
clientRegistration = this.registration2;
471-
requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
472-
request = new MockHttpServletRequest("GET", requestUri);
473-
request.setServletPath(requestUri);
474-
authorizationRequest = this.resolver.resolve(request);
475-
assertPkceNotApplied(authorizationRequest, clientRegistration);
476-
}
477-
478458
private void assertPkceApplied(OAuth2AuthorizationRequest authorizationRequest,
479459
ClientRegistration clientRegistration) {
480460
assertThat(authorizationRequest.getAdditionalParameters()).containsKey(PkceParameterNames.CODE_CHALLENGE);
@@ -531,7 +511,7 @@ public void resolveWhenAuthenticationRequestWithValidOidcClientThenResolves() {
531511
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
532512
+ "scope=openid&state=.{15,}&"
533513
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
534-
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}");
514+
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge=.{15,}&code_challenge_method=S256");
535515
}
536516

537517
// gh-7696
@@ -551,7 +531,8 @@ public void resolveWhenAuthorizationRequestCustomizerRemovesNonceThenQueryExclud
551531
assertThat(authorizationRequest.getAuthorizationRequestUri())
552532
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
553533
+ "scope=openid&state=.{15,}&"
554-
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id");
534+
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&" +
535+
"code_challenge=.{15,}&code_challenge_method=S256");
555536
}
556537

557538
@Test
@@ -569,7 +550,7 @@ public void resolveWhenAuthorizationRequestCustomizerAddsParameterThenQueryInclu
569550
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
570551
+ "scope=openid&state=.{15,}&"
571552
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
572-
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}&" + "param1=value1");
553+
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}" + "&code_challenge=.{15,}&code_challenge_method=S256&param1=value1");
573554
}
574555

575556
@Test
@@ -586,7 +567,7 @@ public void resolveWhenAuthorizationRequestCustomizerOverridesParameterThenQuery
586567
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches(
587568
"https://example.com/login/oauth/authorize\\?" + "response_type=code&" + "scope=openid&state=.{15,}&"
588569
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
589-
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}&" + "appid=client-id");
570+
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}" + "&code_challenge=.{15,}&code_challenge_method=S256&appid=client-id");
590571
}
591572

592573
@Test

0 commit comments

Comments
 (0)