Skip to content

Commit d66fa09

Browse files
author
chao.wang
committed
Move valid provider issuer check to OidcBackChannelLogoutTokenValidator constructor
1 parent 5161d96 commit d66fa09

File tree

4 files changed

+23
-26
lines changed

4 files changed

+23
-26
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OidcBackChannelLogoutTokenValidator.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.springframework.security.oauth2.core.OAuth2TokenValidator;
3131
import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult;
3232
import org.springframework.security.oauth2.jwt.Jwt;
33-
import org.springframework.util.StringUtils;
33+
import org.springframework.util.Assert;
3434

3535
/**
3636
* A {@link OAuth2TokenValidator} that validates OIDC Logout Token claims in conformance
@@ -58,7 +58,9 @@ final class OidcBackChannelLogoutTokenValidator implements OAuth2TokenValidator<
5858

5959
OidcBackChannelLogoutTokenValidator(ClientRegistration clientRegistration) {
6060
this.audience = clientRegistration.getClientId();
61-
this.issuer = clientRegistration.getProviderDetails().getIssuerUri();
61+
String issuer = clientRegistration.getProviderDetails().getIssuerUri();
62+
Assert.hasText(issuer, "Provider issuer cannot be null");
63+
this.issuer = issuer;
6264
}
6365

6466
@Override
@@ -78,9 +80,6 @@ else if (events.get(BACK_CHANNEL_LOGOUT_EVENT) == null) {
7880
if (issuer == null) {
7981
errors.add(invalidLogoutToken("iss claim must not be null"));
8082
}
81-
else if (!StringUtils.hasText(this.issuer)) {
82-
errors.add(invalidLogoutToken("Provider issuer must not be null"));
83-
}
8483
else if (!this.issuer.equals(issuer)) {
8584
errors.add(invalidLogoutToken(
8685
"iss claim value must match `ClientRegistration#getProviderDetails#getIssuerUri`"));

config/src/main/java/org/springframework/security/config/web/server/OidcBackChannelLogoutTokenValidator.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.springframework.security.oauth2.core.OAuth2TokenValidator;
3131
import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult;
3232
import org.springframework.security.oauth2.jwt.Jwt;
33-
import org.springframework.util.StringUtils;
33+
import org.springframework.util.Assert;
3434

3535
/**
3636
* A {@link OAuth2TokenValidator} that validates OIDC Logout Token claims in conformance
@@ -58,7 +58,9 @@ final class OidcBackChannelLogoutTokenValidator implements OAuth2TokenValidator<
5858

5959
OidcBackChannelLogoutTokenValidator(ClientRegistration clientRegistration) {
6060
this.audience = clientRegistration.getClientId();
61-
this.issuer = clientRegistration.getProviderDetails().getIssuerUri();
61+
String issuer = clientRegistration.getProviderDetails().getIssuerUri();
62+
Assert.hasText(issuer, "Provider issuer cannot be null");
63+
this.issuer = issuer;
6264
}
6365

6466
@Override
@@ -78,9 +80,6 @@ else if (events.get(BACK_CHANNEL_LOGOUT_EVENT) == null) {
7880
if (issuer == null) {
7981
errors.add(invalidLogoutToken("iss claim must not be null"));
8082
}
81-
else if (!StringUtils.hasText(this.issuer)) {
82-
errors.add(invalidLogoutToken("Provider issuer must not be null"));
83-
}
8483
else if (!this.issuer.equals(issuer)) {
8584
errors.add(invalidLogoutToken(
8685
"iss claim value must match `ClientRegistration#getProviderDetails#getIssuerUri`"));

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
import org.springframework.web.bind.annotation.RestController;
9393
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
9494

95+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
9596
import static org.hamcrest.Matchers.containsString;
9697
import static org.mockito.ArgumentMatchers.any;
9798
import static org.mockito.BDDMockito.willThrow;
@@ -506,9 +507,8 @@ String idToken(String sessionId) {
506507
}
507508

508509
private String getIssuerUri() {
509-
String issuerUri = registration.getProviderDetails().getIssuerUri();
510-
if (StringUtils.hasText(issuerUri)) {
511-
return issuerUri;
510+
if (this.web == null) {
511+
return TestClientRegistrations.clientRegistration().build().getProviderDetails().getIssuerUri();
512512
}
513513
return this.web.url("/").toString();
514514
}
@@ -651,7 +651,7 @@ private String getContentAsString(MockHttpServletResponse response) {
651651
}
652652

653653
@Test
654-
void logoutWhenProviderIssuerMissingThenBadRequest() throws Exception {
654+
void logoutWhenProviderIssuerMissingThenThrowIllegalArgumentException() throws Exception {
655655
this.spring.register(WebServerConfig.class, OidcProviderConfig.class, ProviderIssuerMissingConfig.class).autowire();
656656
String registrationId = this.clientRegistration.getRegistrationId();
657657
MockHttpSession session = login();
@@ -660,11 +660,11 @@ void logoutWhenProviderIssuerMissingThenBadRequest() throws Exception {
660660
.andReturn()
661661
.getResponse()
662662
.getContentAsString();
663-
this.mvc
664-
.perform(post(this.web.url("/logout/connect/back-channel/" + registrationId).toString())
665-
.param("logout_token", logoutToken))
666-
.andExpect(status().isBadRequest());
667-
this.mvc.perform(get("/token/logout").session(session)).andExpect(status().isOk());
663+
assertThatIllegalArgumentException().isThrownBy(() -> {
664+
this.mvc
665+
.perform(post(this.web.url("/logout/connect/back-channel/" + registrationId).toString())
666+
.param("logout_token", logoutToken));
667+
});
668668
}
669669

670670
@Configuration
@@ -676,7 +676,7 @@ static class ProviderIssuerMissingRegistrationConfig {
676676
@Bean
677677
ClientRegistration clientRegistration() {
678678
if (this.web == null) {
679-
return TestClientRegistrations.clientRegistration().build();
679+
return TestClientRegistrations.clientRegistration().issuerUri(null).build();
680680
}
681681
String issuer = this.web.url("/").toString();
682682
return TestClientRegistrations.clientRegistration()

config/src/test/java/org/springframework/security/config/web/server/OidcLogoutSpecTests.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -603,9 +603,8 @@ String idToken(String sessionId) {
603603
}
604604

605605
private String getIssuerUri() {
606-
String issuerUri = registration.getProviderDetails().getIssuerUri();
607-
if (StringUtils.hasText(issuerUri)) {
608-
return issuerUri;
606+
if (this.web == null) {
607+
return TestClientRegistrations.clientRegistration().build().getProviderDetails().getIssuerUri();
609608
}
610609
return this.web.url("/").toString();
611610
}
@@ -743,7 +742,7 @@ private MockResponse toMockResponse(FluxExchangeResult<String> result) {
743742
}
744743

745744
@Test
746-
void logoutWhenProviderIssuerMissingThenBadRequest() {
745+
void logoutWhenProviderIssuerMissingThen5xxServerError() {
747746
this.spring.register(WebServerConfig.class, OidcProviderConfig.class, ProviderIssuerMissingConfig.class).autowire();
748747
String registrationId = this.clientRegistration.getRegistrationId();
749748
String session = login();
@@ -761,7 +760,7 @@ void logoutWhenProviderIssuerMissingThenBadRequest() {
761760
.body(BodyInserters.fromFormData("logout_token", logoutToken))
762761
.exchange()
763762
.expectStatus()
764-
.isBadRequest();
763+
.is5xxServerError();
765764
this.test.mutateWith(session(session)).get().uri("/token/logout").exchange().expectStatus().isOk();
766765
}
767766

@@ -774,7 +773,7 @@ static class ProviderIssuerMissingRegistrationConfig {
774773
@Bean
775774
ClientRegistration clientRegistration() {
776775
if (this.web == null) {
777-
return TestClientRegistrations.clientRegistration().build();
776+
return TestClientRegistrations.clientRegistration().issuerUri(null).build();
778777
}
779778
String issuer = this.web.url("/").toString();
780779
return TestClientRegistrations.clientRegistration()

0 commit comments

Comments
 (0)