Skip to content

Commit 24bd90c

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]>
2 parents 1b34e2f + df46772 commit 24bd90c

File tree

10 files changed

+93
-80
lines changed

10 files changed

+93
-80
lines changed

config/src/test/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2ClientConfigurerTests.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public void configureWhenAuthorizationCodeRequestThenRedirectForAuthorization()
156156
.andExpect(status().is3xxRedirection()).andReturn();
157157
assertThat(mvcResult.getResponse().getRedirectedUrl())
158158
.matches("https://provider.com/oauth2/authorize\\?" + "response_type=code&client_id=client-1&"
159-
+ "scope=user&state=.{15,}&" + "redirect_uri=http://localhost/client-1");
159+
+ "scope=user&state=.{15,}&" + "redirect_uri=http://localhost/client-1&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
160160
// @formatter:on
161161
}
162162

@@ -166,9 +166,9 @@ public void configureWhenOauth2ClientInLambdaThenRedirectForAuthorization() thro
166166
MvcResult mvcResult = this.mockMvc.perform(get("/oauth2/authorization/registration-1"))
167167
.andExpect(status().is3xxRedirection())
168168
.andReturn();
169-
assertThat(mvcResult.getResponse().getRedirectedUrl())
170-
.matches("https://provider.com/oauth2/authorize\\?" + "response_type=code&client_id=client-1&"
171-
+ "scope=user&state=.{15,}&" + "redirect_uri=http://localhost/client-1");
169+
assertThat(mvcResult.getResponse().getRedirectedUrl()).matches("https://provider.com/oauth2/authorize\\?"
170+
+ "response_type=code&client_id=client-1&" + "scope=user&state=.{15,}&"
171+
+ "redirect_uri=http://localhost/client-1&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
172172
}
173173

174174
@Test
@@ -215,9 +215,9 @@ public void configureWhenRequestCacheProvidedAndClientAuthorizationRequiredExcep
215215
MvcResult mvcResult = this.mockMvc.perform(get("/resource1").with(user("user1")))
216216
.andExpect(status().is3xxRedirection())
217217
.andReturn();
218-
assertThat(mvcResult.getResponse().getRedirectedUrl())
219-
.matches("https://provider.com/oauth2/authorize\\?" + "response_type=code&client_id=client-1&"
220-
+ "scope=user&state=.{15,}&" + "redirect_uri=http://localhost/client-1");
218+
assertThat(mvcResult.getResponse().getRedirectedUrl()).matches("https://provider.com/oauth2/authorize\\?"
219+
+ "response_type=code&client_id=client-1&" + "scope=user&state=.{15,}&"
220+
+ "redirect_uri=http://localhost/client-1&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
221221
verify(requestCache).saveRequest(any(HttpServletRequest.class), any(HttpServletResponse.class));
222222
}
223223

config/src/test/java/org/springframework/security/config/http/OAuth2ClientBeanDefinitionParserTests.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ public void requestWhenAuthorizeThenRedirect() throws Exception {
112112
.andExpect(status().is3xxRedirection())
113113
.andReturn();
114114
// @formatter:on
115-
assertThat(result.getResponse().getRedirectedUrl()).matches(
116-
"https://accounts.google.com/o/oauth2/v2/auth\\?" + "response_type=code&client_id=google-client-id&"
117-
+ "scope=scope1%20scope2&state=.{15,}&redirect_uri=http://localhost/callback/google");
115+
assertThat(result.getResponse().getRedirectedUrl()).matches("https://accounts.google.com/o/oauth2/v2/auth\\?"
116+
+ "response_type=code&client_id=google-client-id&"
117+
+ "scope=scope1%20scope2&state=.{15,}&redirect_uri=http://localhost/callback/google&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
118118
}
119119

120120
@Test
@@ -134,9 +134,9 @@ public void requestWhenCustomClientRegistrationRepositoryThenCalled() throws Exc
134134
.andExpect(status().is3xxRedirection())
135135
.andReturn();
136136
// @formatter:on
137-
assertThat(result.getResponse().getRedirectedUrl()).matches(
138-
"https://accounts.google.com/o/oauth2/v2/auth\\?" + "response_type=code&client_id=google-client-id&"
139-
+ "scope=scope1%20scope2&state=.{15,}&redirect_uri=http://localhost/callback/google");
137+
assertThat(result.getResponse().getRedirectedUrl()).matches("https://accounts.google.com/o/oauth2/v2/auth\\?"
138+
+ "response_type=code&client_id=google-client-id&"
139+
+ "scope=scope1%20scope2&state=.{15,}&redirect_uri=http://localhost/callback/google&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
140140
verify(this.clientRegistrationRepository).findByRegistrationId(any());
141141
}
142142

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,10 @@ private ClientRegistration create() {
655655
clientRegistration.clientName = StringUtils.hasText(this.clientName) ? this.clientName
656656
: this.registrationId;
657657
clientRegistration.clientSettings = this.clientSettings;
658+
if (this.clientSettings.requireProofKey) {
659+
clientRegistration.clientSettings.requireProofKey = clientRegistration.authorizationGrantType
660+
.equals(AuthorizationGrantType.AUTHORIZATION_CODE);
661+
}
658662
return clientRegistration;
659663
}
660664

@@ -713,12 +717,6 @@ private void validateAuthorizationGrantTypes() {
713717
"AuthorizationGrantType: %s does not match the pre-defined constant %s and won't match a valid OAuth2AuthorizedClientProvider",
714718
this.authorizationGrantType, authorizationGrantType));
715719
}
716-
if (!AuthorizationGrantType.AUTHORIZATION_CODE.equals(this.authorizationGrantType)
717-
&& this.clientSettings.isRequireProofKey()) {
718-
throw new IllegalStateException(
719-
"clientSettings.isRequireProofKey=true is only valid with authorizationGrantType=AUTHORIZATION_CODE. Got authorizationGrantType="
720-
+ this.authorizationGrantType);
721-
}
722720
}
723721
}
724722

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/DefaultOAuth2AuthorizationRequestResolver.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.springframework.security.oauth2.client.registration.ClientRegistration;
3232
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
3333
import org.springframework.security.oauth2.core.AuthorizationGrantType;
34-
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
3534
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
3635
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
3736
import org.springframework.security.oauth2.core.oidc.OidcScopes;

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/server/DefaultServerOAuth2AuthorizationRequestResolver.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
3535
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestCustomizers;
3636
import org.springframework.security.oauth2.core.AuthorizationGrantType;
37-
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
3837
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
3938
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
4039
import org.springframework.security.oauth2.core.oidc.OidcScopes;

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737

3838
import static org.assertj.core.api.Assertions.assertThat;
3939
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
40-
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
4140

4241
/**
4342
* Tests for {@link ClientRegistration}.
@@ -780,7 +779,7 @@ void buildWhenDefaultClientSettingsThenDefaulted() {
780779
// should not be null
781780
assertThat(clientRegistration.getClientSettings()).isNotNull();
782781
// proof key should be false for passivity
783-
assertThat(clientRegistration.getClientSettings().isRequireProofKey()).isFalse();
782+
assertThat(clientRegistration.getClientSettings().isRequireProofKey()).isTrue();
784783
}
785784

786785
// gh-16382
@@ -816,10 +815,8 @@ void buildWhenInvalidGrantTypeForPkceThenException(AuthorizationGrantType invali
816815
.authorizationUri(AUTHORIZATION_URI)
817816
.tokenUri(TOKEN_URI);
818817

819-
assertThatIllegalStateException().describedAs(
820-
"clientSettings.isRequireProofKey=true is only valid with authorizationGrantType=AUTHORIZATION_CODE. Got authorizationGrantType={}",
821-
invalidGrantType)
822-
.isThrownBy(builder::build);
818+
ClientRegistration clientRegistration = builder.build();
819+
assertThat(clientRegistration.getClientSettings().isRequireProofKey()).isFalse();
823820
}
824821

825822
static List<AuthorizationGrantType> invalidPkceGrantTypes() {

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,18 @@ public static ClientRegistration.Builder clientRegistration2() {
6666

6767
public static ClientRegistration.Builder publicClientRegistrationWithNoPkce() {
6868
return ClientRegistration.withRegistrationId("no-pkce")
69-
.redirectUri("{baseUrl}/{action}/oauth2/code/{registrationId}")
70-
.clientAuthenticationMethod(ClientAuthenticationMethod.NONE)
71-
.clientSettings(ClientRegistration.ClientSettings.builder().requireProofKey(false).build())
72-
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
73-
.scope("read:user")
74-
.authorizationUri("https://example.com/login/oauth/authorize")
75-
.tokenUri("https://example.com/login/oauth/access_token")
76-
.userInfoUri("https://api.example.com/user")
77-
.userNameAttributeName("id")
78-
.clientName("Client Name")
79-
.clientId("client-id")
80-
.clientSecret(null);
69+
.redirectUri("{baseUrl}/{action}/oauth2/code/{registrationId}")
70+
.clientAuthenticationMethod(ClientAuthenticationMethod.NONE)
71+
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
72+
.clientSettings(ClientRegistration.ClientSettings.builder().requireProofKey(false).build())
73+
.scope("read:user")
74+
.authorizationUri("https://example.com/login/oauth/authorize")
75+
.tokenUri("https://example.com/login/oauth/access_token")
76+
.userInfoUri("https://api.example.com/user")
77+
.userNameAttributeName("id")
78+
.clientName("Client Name")
79+
.clientId("client-id")
80+
.clientSecret(null);
8181
}
8282

8383
public static ClientRegistration.Builder clientCredentials() {

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

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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,nonProofKeyPublicClientRegistration);
97+
this.publicClientRegistration, this.oidcRegistration, this.nonProofKeyPublicClientRegistration);
9898
this.resolver = new DefaultOAuth2AuthorizationRequestResolver(this.clientRegistrationRepository,
9999
this.authorizationRequestBaseUri);
100100
}
@@ -175,15 +175,14 @@ public void resolveWhenAuthorizationRequestWithValidClientThenResolves() {
175175
assertThat(authorizationRequest.getState()).isNotNull();
176176
assertThat(authorizationRequest.getAdditionalParameters())
177177
.doesNotContainKey(OAuth2ParameterNames.REGISTRATION_ID);
178-
assertThat(authorizationRequest.getAttributes())
179-
.containsExactly(
180-
entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()),
181-
entry(PkceParameterNames.CODE_VERIFIER, authorizationRequest.getAttributes().get(PkceParameterNames.CODE_VERIFIER))
182-
);
178+
assertThat(authorizationRequest.getAttributes()).containsExactly(
179+
entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()),
180+
entry(PkceParameterNames.CODE_VERIFIER,
181+
authorizationRequest.getAttributes().get(PkceParameterNames.CODE_VERIFIER)));
183182
assertThat(authorizationRequest.getAuthorizationRequestUri())
184183
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
185184
+ "scope=read:user&state=.{15,}&"
186-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256");
185+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
187186
}
188187

189188
@Test
@@ -195,11 +194,10 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenResolves
195194
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request,
196195
clientRegistration.getRegistrationId());
197196
assertThat(authorizationRequest).isNotNull();
198-
assertThat(authorizationRequest.getAttributes())
199-
.containsExactly(
200-
entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()),
201-
entry(PkceParameterNames.CODE_VERIFIER, authorizationRequest.getAttributes().get(PkceParameterNames.CODE_VERIFIER))
202-
);
197+
assertThat(authorizationRequest.getAttributes()).containsExactly(
198+
entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()),
199+
entry(PkceParameterNames.CODE_VERIFIER,
200+
authorizationRequest.getAttributes().get(PkceParameterNames.CODE_VERIFIER)));
203201
}
204202

205203
@Test
@@ -307,7 +305,8 @@ public void resolveWhenAuthorizationRequestIncludesPort80ThenExpandedRedirectUri
307305
assertThat(authorizationRequest.getAuthorizationRequestUri())
308306
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
309307
+ "scope=read:user&state=.{15,}&"
310-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id"+ "&code_challenge=.{15,}&code_challenge_method=S256");
308+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id"
309+
+ "&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
311310
}
312311

313312
@Test
@@ -323,7 +322,8 @@ public void resolveWhenAuthorizationRequestIncludesPort443ThenExpandedRedirectUr
323322
assertThat(authorizationRequest.getAuthorizationRequestUri())
324323
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
325324
+ "scope=read:user&state=.{15,}&"
326-
+ "redirect_uri=https://example.com/login/oauth2/code/registration-id" + "&code_challenge=.{15,}&code_challenge_method=S256");
325+
+ "redirect_uri=https://example.com/login/oauth2/code/registration-id"
326+
+ "&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
327327
}
328328

329329
@Test
@@ -337,7 +337,7 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenRedirect
337337
assertThat(authorizationRequest.getAuthorizationRequestUri())
338338
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
339339
+ "scope=read:user&state=.{15,}&"
340-
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256");
340+
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
341341
}
342342

343343
@Test
@@ -350,7 +350,8 @@ public void resolveWhenAuthorizationRequestOAuth2LoginThenRedirectUriIsLogin() {
350350
assertThat(authorizationRequest.getAuthorizationRequestUri())
351351
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id-2&"
352352
+ "scope=read:user&state=.{15,}&"
353-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2" + "&code_challenge=.{15,}&code_challenge_method=S256");
353+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2"
354+
+ "&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
354355
}
355356

356357
@Test
@@ -364,7 +365,8 @@ public void resolveWhenAuthorizationRequestHasActionParameterAuthorizeThenRedire
364365
assertThat(authorizationRequest.getAuthorizationRequestUri())
365366
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
366367
+ "scope=read:user&state=.{15,}&"
367-
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256");
368+
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&"
369+
+ "code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
368370
}
369371

370372
@Test
@@ -378,7 +380,7 @@ public void resolveWhenAuthorizationRequestHasActionParameterLoginThenRedirectUr
378380
assertThat(authorizationRequest.getAuthorizationRequestUri())
379381
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id-2&"
380382
+ "scope=read:user&state=.{15,}&"
381-
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2&code_challenge=.{15,}&code_challenge_method=S256");
383+
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id-2&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
382384
}
383385

384386
@Test
@@ -447,7 +449,13 @@ public void resolveWhenAuthorizationRequestApplyPkceToConfidentialClientThenAppl
447449

448450
@Test
449451
public void resolveWhenAuthorizationRequestApplyPkceToPublicClientWithRequireProofKeyFalseThenApplied() {
450-
ClientRegistration clientRegistration = this.nonProofKeyPublicClientRegistration; // change to non proof key public client
452+
ClientRegistration clientRegistration = this.nonProofKeyPublicClientRegistration; // change
453+
// to
454+
// non
455+
// proof
456+
// key
457+
// public
458+
// client
451459
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
452460
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
453461
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
@@ -511,7 +519,7 @@ public void resolveWhenAuthenticationRequestWithValidOidcClientThenResolves() {
511519
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
512520
+ "scope=openid&state=.{15,}&"
513521
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
514-
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge=.{15,}&code_challenge_method=S256");
522+
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
515523
}
516524

517525
// gh-7696
@@ -531,8 +539,8 @@ public void resolveWhenAuthorizationRequestCustomizerRemovesNonceThenQueryExclud
531539
assertThat(authorizationRequest.getAuthorizationRequestUri())
532540
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
533541
+ "scope=openid&state=.{15,}&"
534-
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&" +
535-
"code_challenge=.{15,}&code_challenge_method=S256");
542+
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
543+
+ "code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256");
536544
}
537545

538546
@Test
@@ -550,7 +558,8 @@ public void resolveWhenAuthorizationRequestCustomizerAddsParameterThenQueryInclu
550558
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
551559
+ "scope=openid&state=.{15,}&"
552560
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
553-
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}" + "&code_challenge=.{15,}&code_challenge_method=S256&param1=value1");
561+
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}"
562+
+ "&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256&param1=value1");
554563
}
555564

556565
@Test
@@ -567,7 +576,8 @@ public void resolveWhenAuthorizationRequestCustomizerOverridesParameterThenQuery
567576
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches(
568577
"https://example.com/login/oauth/authorize\\?" + "response_type=code&" + "scope=openid&state=.{15,}&"
569578
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
570-
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}" + "&code_challenge=.{15,}&code_challenge_method=S256&appid=client-id");
579+
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}"
580+
+ "&code_challenge=([a-zA-Z0-9\\-\\.\\_\\~]){43}&code_challenge_method=S256&appid=client-id");
571581
}
572582

573583
@Test
@@ -595,6 +605,7 @@ private static ClientRegistration.Builder pkceClientRegistration() {
595605
.clientId("client-id-3")
596606
.clientSecret("client-secret");
597607
}
608+
598609
private static ClientRegistration.Builder fineRedirectUriTemplateClientRegistration() {
599610
// @formatter:off
600611
return ClientRegistration.withRegistrationId("fine-redirect-uri-template-client-registration")

0 commit comments

Comments
 (0)