Skip to content

Commit d0bb94b

Browse files
NotFound403jgrandja
authored andcommitted
Enhance validation for configured issuer
Closes gh-649
1 parent b991e1a commit d0bb94b

File tree

2 files changed

+92
-1
lines changed
  • oauth2-authorization-server/src

2 files changed

+92
-1
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/authorization/OAuth2AuthorizationServerConfigurer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,17 @@ private void initEndpointMatchers(ProviderSettings providerSettings) {
427427

428428
private static void validateProviderSettings(ProviderSettings providerSettings) {
429429
if (providerSettings.getIssuer() != null) {
430+
URI issuerUri;
430431
try {
431-
new URI(providerSettings.getIssuer()).toURL();
432+
issuerUri = new URI(providerSettings.getIssuer());
433+
issuerUri.toURL();
432434
} catch (Exception ex) {
433435
throw new IllegalArgumentException("issuer must be a valid URL", ex);
434436
}
437+
// rfc8414 https://datatracker.ietf.org/doc/html/rfc8414#section-2
438+
if (issuerUri.getQuery() != null || issuerUri.getFragment() != null) {
439+
throw new IllegalArgumentException("issuer cannot contain query or fragment component");
440+
}
435441
}
436442
}
437443

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

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,41 @@ public void loadContextWhenIssuerNotValidUriThenThrowException() {
210210
);
211211
}
212212

213+
@Test
214+
public void loadContextWhenIssuerWithQueryThenThrowException() {
215+
assertThatThrownBy(
216+
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidQueryIssuerUrl.class).autowire()
217+
);
218+
}
219+
220+
@Test
221+
public void loadContextWhenIssuerWithFragmentThenThrowException() {
222+
assertThatThrownBy(
223+
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidFragmentIssuerUrl.class).autowire()
224+
);
225+
}
226+
227+
@Test
228+
public void loadContextWhenIssuerWithQueryAndFragmentThenThrowException() {
229+
assertThatThrownBy(
230+
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidQueryAndFragmentIssuerUrl.class).autowire()
231+
);
232+
}
233+
234+
@Test
235+
public void loadContextWhenIssuerEndWithQuestionMarkCharacterThenThrowException() {
236+
assertThatThrownBy(
237+
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidIssuerUrlEndWithQuestionMarkCharacter.class).autowire()
238+
);
239+
}
240+
241+
@Test
242+
public void loadContextWhenIssuerEndWithNumberSignCharacterThenThrowException() {
243+
assertThatThrownBy(
244+
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidIssuerUrlEndWithNumberSignCharacter.class).autowire()
245+
);
246+
}
247+
213248
@Test
214249
public void requestWhenAuthenticationRequestThenTokenResponseIncludesIdToken() throws Exception {
215250
this.spring.register(AuthorizationServerConfiguration.class).autowire();
@@ -459,4 +494,54 @@ ProviderSettings providerSettings() {
459494
}
460495
}
461496

497+
@EnableWebSecurity
498+
@Import(OAuth2AuthorizationServerConfiguration.class)
499+
static class AuthorizationServerConfigurationWithInvalidQueryIssuerUrl extends AuthorizationServerConfiguration {
500+
501+
@Bean
502+
ProviderSettings providerSettings() {
503+
return ProviderSettings.builder().issuer("https://localhost:9000?something=any").build();
504+
}
505+
}
506+
507+
@EnableWebSecurity
508+
@Import(OAuth2AuthorizationServerConfiguration.class)
509+
static class AuthorizationServerConfigurationWithInvalidFragmentIssuerUrl extends AuthorizationServerConfiguration {
510+
511+
@Bean
512+
ProviderSettings providerSettings() {
513+
return ProviderSettings.builder().issuer("https://localhost:9000#fragment").build();
514+
}
515+
}
516+
517+
@EnableWebSecurity
518+
@Import(OAuth2AuthorizationServerConfiguration.class)
519+
static class AuthorizationServerConfigurationWithInvalidQueryAndFragmentIssuerUrl extends AuthorizationServerConfiguration {
520+
521+
@Bean
522+
ProviderSettings providerSettings() {
523+
return ProviderSettings.builder().issuer("https://localhost:9000?something=any#fragment").build();
524+
}
525+
}
526+
527+
@EnableWebSecurity
528+
@Import(OAuth2AuthorizationServerConfiguration.class)
529+
static class AuthorizationServerConfigurationWithInvalidIssuerUrlEndWithQuestionMarkCharacter extends AuthorizationServerConfiguration {
530+
531+
@Bean
532+
ProviderSettings providerSettings() {
533+
return ProviderSettings.builder().issuer("https://localhost:9000?").build();
534+
}
535+
}
536+
537+
@EnableWebSecurity
538+
@Import(OAuth2AuthorizationServerConfiguration.class)
539+
static class AuthorizationServerConfigurationWithInvalidIssuerUrlEndWithNumberSignCharacter extends AuthorizationServerConfiguration {
540+
541+
@Bean
542+
ProviderSettings providerSettings() {
543+
return ProviderSettings.builder().issuer("https://localhost:9000/#").build();
544+
}
545+
}
546+
462547
}

0 commit comments

Comments
 (0)