Polish gh-143
This commit is contained in:
@@ -24,13 +24,11 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
|
||||
import org.springframework.security.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||
import org.springframework.security.config.test.SpringTestRule;
|
||||
import org.springframework.security.crypto.key.CryptoKeySource;
|
||||
import org.springframework.security.crypto.key.StaticKeyGeneratingCryptoKeySource;
|
||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||
import org.springframework.security.oauth2.server.authorization.config.ProviderSettings;
|
||||
import org.springframework.security.oauth2.server.authorization.web.OidcProviderConfigurationEndpointFilter;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.MvcResult;
|
||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
@@ -40,7 +38,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* Integration tests for the OpenID Connect.
|
||||
* Integration tests for OpenID Connect 1.0.
|
||||
*
|
||||
* @author Daniel Garnier-Moiroux
|
||||
*/
|
||||
@@ -54,17 +52,17 @@ public class OidcTests {
|
||||
private MockMvc mvc;
|
||||
|
||||
@Test
|
||||
public void requestWhenIssuerSetAndOpenIDProviderConfigurationRequestThenReturnProviderConfigurationResponse() throws Exception {
|
||||
public void requestWhenConfigurationRequestAndIssuerSetThenReturnConfigurationResponse() throws Exception {
|
||||
this.spring.register(AuthorizationServerConfigurationWithIssuer.class).autowire();
|
||||
|
||||
this.mvc.perform(MockMvcRequestBuilders.get(OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI))
|
||||
this.mvc.perform(get(OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI))
|
||||
.andExpect(status().is2xxSuccessful())
|
||||
.andExpect(jsonPath("issuer").value(issuerUrl))
|
||||
.andReturn();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void requestWhenIssuerNotSetAndOpenIDProviderConfigurationRequestThenRedirectsToLogin() throws Exception {
|
||||
public void requestWhenConfigurationRequestAndIssuerNotSetThenRedirectToLogin() throws Exception {
|
||||
this.spring.register(AuthorizationServerConfiguration.class).autowire();
|
||||
|
||||
MvcResult mvcResult = this.mvc.perform(get(OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI))
|
||||
@@ -74,16 +72,16 @@ public class OidcTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void requestWhenIssuerNotValidUrlThenThrowException() {
|
||||
public void loadContextWhenIssuerNotValidUrlThenThrowException() {
|
||||
assertThatThrownBy(
|
||||
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidUrlIssuer.class).autowire()
|
||||
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidIssuerUrl.class).autowire()
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void requestWhenIssuerNotValidUriThenThrowException() {
|
||||
public void loadContextWhenIssuerNotValidUriThenThrowException() {
|
||||
assertThatThrownBy(
|
||||
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidUriIssuer.class).autowire()
|
||||
() -> this.spring.register(AuthorizationServerConfigurationWithInvalidIssuerUri.class).autowire()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -98,20 +96,15 @@ public class OidcTests {
|
||||
|
||||
@Bean
|
||||
CryptoKeySource keySource() {
|
||||
return new StaticKeyGeneratingCryptoKeySource();
|
||||
}
|
||||
|
||||
@Bean
|
||||
ProviderSettings providerSettings() {
|
||||
return new ProviderSettings();
|
||||
return mock(CryptoKeySource.class);
|
||||
}
|
||||
}
|
||||
|
||||
@EnableWebSecurity
|
||||
@Import(OAuth2AuthorizationServerConfiguration.class)
|
||||
static class AuthorizationServerConfigurationWithIssuer extends AuthorizationServerConfiguration {
|
||||
|
||||
@Bean
|
||||
@Override
|
||||
ProviderSettings providerSettings() {
|
||||
return new ProviderSettings().issuer(issuerUrl);
|
||||
}
|
||||
@@ -119,9 +112,9 @@ public class OidcTests {
|
||||
|
||||
@EnableWebSecurity
|
||||
@Import(OAuth2AuthorizationServerConfiguration.class)
|
||||
static class AuthorizationServerConfigurationWithInvalidUrlIssuer extends AuthorizationServerConfiguration {
|
||||
static class AuthorizationServerConfigurationWithInvalidIssuerUrl extends AuthorizationServerConfiguration {
|
||||
|
||||
@Bean
|
||||
@Override
|
||||
ProviderSettings providerSettings() {
|
||||
return new ProviderSettings().issuer("urn:example");
|
||||
}
|
||||
@@ -129,9 +122,9 @@ public class OidcTests {
|
||||
|
||||
@EnableWebSecurity
|
||||
@Import(OAuth2AuthorizationServerConfiguration.class)
|
||||
static class AuthorizationServerConfigurationWithInvalidUriIssuer extends AuthorizationServerConfiguration {
|
||||
static class AuthorizationServerConfigurationWithInvalidIssuerUri extends AuthorizationServerConfiguration {
|
||||
|
||||
@Bean
|
||||
@Override
|
||||
ProviderSettings providerSettings() {
|
||||
return new ProviderSettings().issuer("https://not a valid uri");
|
||||
}
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.security.oauth2.core.converter;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* This class is temporary and will be removed after upgrading to Spring Security 5.5.0 GA.
|
||||
* These tests will probably be folded into tests for {@link ClaimConversionService}.
|
||||
*
|
||||
* Tests for {@link ObjectToSetStringConverter2}.
|
||||
*
|
||||
* @author Daniel Garnier-Moiroux
|
||||
*/
|
||||
public class ObjectToSetStringConverter2Test {
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void convertFromNullThenReturnNull() {
|
||||
ObjectToSetStringConverter2 converter = new ObjectToSetStringConverter2();
|
||||
Set<String> result = (Set<String>) converter.convert(null, null, null);
|
||||
assertThat(result).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void convertFromStringThenReturnSet() {
|
||||
ObjectToSetStringConverter2 converter = new ObjectToSetStringConverter2();
|
||||
Set<String> result = (Set<String>) converter.convert("Hello", null, null);
|
||||
assertThat(result).containsExactly("Hello");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void convertFromSetThenReturnSet() {
|
||||
ObjectToSetStringConverter2 converter = new ObjectToSetStringConverter2();
|
||||
Set<String> result = (Set<String>) converter.convert(new HashSet<>(Arrays.asList("Hello", "world")), null, null);
|
||||
assertThat(result).containsExactlyInAnyOrder("Hello", "world");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void convertFromCollectionThenReturnSet() {
|
||||
ObjectToSetStringConverter2 converter = new ObjectToSetStringConverter2();
|
||||
Set<String> result = (Set<String>) converter.convert(Arrays.asList("Hello", "world"), null, null);
|
||||
assertThat(result).containsExactlyInAnyOrder("Hello", "world");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void convertFromEmptyCollectionThenReturnEmptySet() {
|
||||
ObjectToSetStringConverter2 converter = new ObjectToSetStringConverter2();
|
||||
Set<String> result = (Set<String>) converter.convert(Collections.emptyList(), null, null);
|
||||
assertThat(result).isEmpty();
|
||||
}
|
||||
}
|
||||
@@ -17,11 +17,12 @@ package org.springframework.security.oauth2.core.oidc;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
@@ -54,7 +55,7 @@ public class OidcProviderConfigurationTests {
|
||||
.grantType("authorization_code")
|
||||
.grantType("client_credentials")
|
||||
.subjectType("public")
|
||||
.tokenEndpointAuthenticationMethod("basic")
|
||||
.tokenEndpointAuthenticationMethod("client_secret_basic")
|
||||
.claim("a-claim", "a-value")
|
||||
.build();
|
||||
|
||||
@@ -66,8 +67,8 @@ public class OidcProviderConfigurationTests {
|
||||
assertThat(providerConfiguration.getResponseTypes()).containsExactly("code");
|
||||
assertThat(providerConfiguration.getGrantTypes()).containsExactlyInAnyOrder("authorization_code", "client_credentials");
|
||||
assertThat(providerConfiguration.getSubjectTypes()).containsExactly("public");
|
||||
assertThat(providerConfiguration.getTokenEndpointAuthenticationMethods()).containsExactly("basic");
|
||||
assertThat(providerConfiguration.getClaimAsString("a-claim")).isEqualTo("a-value");
|
||||
assertThat(providerConfiguration.getTokenEndpointAuthenticationMethods()).containsExactly("client_secret_basic");
|
||||
assertThat(providerConfiguration.<String>getClaim("a-claim")).isEqualTo("a-value");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -94,15 +95,15 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildFromClaimsThenCreated() {
|
||||
HashMap<String, Object> claims = new HashMap<>();
|
||||
public void buildWhenClaimsProvidedThenCreated() {
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(OidcProviderMetadataClaimNames.ISSUER, "https://example.com/issuer1");
|
||||
claims.put(OidcProviderMetadataClaimNames.AUTHORIZATION_ENDPOINT, "https://example.com/issuer1/oauth2/authorize");
|
||||
claims.put(OidcProviderMetadataClaimNames.TOKEN_ENDPOINT, "https://example.com/issuer1/oauth2/token");
|
||||
claims.put(OidcProviderMetadataClaimNames.JWKS_URI, "https://example.com/issuer1/oauth2/jwks");
|
||||
claims.put(OidcProviderMetadataClaimNames.SCOPES_SUPPORTED, Collections.singleton("openid"));
|
||||
claims.put(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED, Collections.singleton("code"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED, Collections.singleton("public"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SCOPES_SUPPORTED, Collections.singletonList("openid"));
|
||||
claims.put(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED, Collections.singletonList("code"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED, Collections.singletonList("public"));
|
||||
claims.put("some-claim", "some-value");
|
||||
|
||||
OidcProviderConfiguration providerConfiguration = OidcProviderConfiguration.withClaims(claims).build();
|
||||
@@ -116,19 +117,19 @@ public class OidcProviderConfigurationTests {
|
||||
assertThat(providerConfiguration.getGrantTypes()).isNull();
|
||||
assertThat(providerConfiguration.getSubjectTypes()).containsExactly("public");
|
||||
assertThat(providerConfiguration.getTokenEndpointAuthenticationMethods()).isNull();
|
||||
assertThat(providerConfiguration.getClaimAsString("some-claim")).isEqualTo("some-value");
|
||||
assertThat(providerConfiguration.<String>getClaim("some-claim")).isEqualTo("some-value");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildFromClaimsWhenUsingUrlsThenCreated() {
|
||||
HashMap<String, Object> claims = new HashMap<>();
|
||||
public void buildWhenClaimsProvidedWithUrlsThenCreated() {
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(OidcProviderMetadataClaimNames.ISSUER, url("https://example.com/issuer1"));
|
||||
claims.put(OidcProviderMetadataClaimNames.AUTHORIZATION_ENDPOINT, url("https://example.com/issuer1/oauth2/authorize"));
|
||||
claims.put(OidcProviderMetadataClaimNames.TOKEN_ENDPOINT, url("https://example.com/issuer1/oauth2/token"));
|
||||
claims.put(OidcProviderMetadataClaimNames.JWKS_URI, url("https://example.com/issuer1/oauth2/jwks"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SCOPES_SUPPORTED, Collections.singleton("openid"));
|
||||
claims.put(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED, Collections.singleton("code"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED, Collections.singleton("public"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SCOPES_SUPPORTED, Collections.singletonList("openid"));
|
||||
claims.put(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED, Collections.singletonList("code"));
|
||||
claims.put(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED, Collections.singletonList("public"));
|
||||
claims.put("some-claim", "some-value");
|
||||
|
||||
OidcProviderConfiguration providerConfiguration = OidcProviderConfiguration.withClaims(claims).build();
|
||||
@@ -142,45 +143,46 @@ public class OidcProviderConfigurationTests {
|
||||
assertThat(providerConfiguration.getGrantTypes()).isNull();
|
||||
assertThat(providerConfiguration.getSubjectTypes()).containsExactly("public");
|
||||
assertThat(providerConfiguration.getTokenEndpointAuthenticationMethods()).isNull();
|
||||
assertThat(providerConfiguration.getClaimAsString("some-claim")).isEqualTo("some-value");
|
||||
assertThat(providerConfiguration.<String>getClaim("some-claim")).isEqualTo("some-value");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withClaimsWhenNullThenThrowsException() {
|
||||
public void withClaimsWhenNullThenThrowIllegalArgumentException() {
|
||||
assertThatThrownBy(() -> OidcProviderConfiguration.withClaims(null))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withClaimsWhenMissingRequiredClaimsThenThrowsException() {
|
||||
public void withClaimsWhenMissingRequiredClaimsThenThrowIllegalArgumentException() {
|
||||
assertThatThrownBy(() -> OidcProviderConfiguration.withClaims(Collections.emptyMap()))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("claims cannot be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenCalledTwiceThenGeneratesTwoConfigurations() {
|
||||
OidcProviderConfiguration first = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration first = this.minimalConfigurationBuilder
|
||||
.grantType("client_credentials")
|
||||
.build();
|
||||
|
||||
OidcProviderConfiguration second = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration second = this.minimalConfigurationBuilder
|
||||
.claims((claims) ->
|
||||
{
|
||||
LinkedHashSet<String> newGrantTypes = new LinkedHashSet<>();
|
||||
Set<String> newGrantTypes = new LinkedHashSet<>();
|
||||
newGrantTypes.add("authorization_code");
|
||||
newGrantTypes.add("implicit");
|
||||
newGrantTypes.add("custom_grant");
|
||||
claims.put(OidcProviderMetadataClaimNames.GRANT_TYPES_SUPPORTED, newGrantTypes);
|
||||
}
|
||||
)
|
||||
.build();
|
||||
|
||||
assertThat(first.getGrantTypes()).containsExactly("client_credentials");
|
||||
assertThat(second.getGrantTypes()).containsExactlyInAnyOrder("authorization_code", "implicit");
|
||||
assertThat(second.getGrantTypes()).containsExactlyInAnyOrder("authorization_code", "custom_grant");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingIssuerThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenMissingIssuerThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.ISSUER));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
@@ -189,18 +191,18 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenIssuerIsNotAnUrlThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenIssuerNotUrlThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.put(OidcProviderMetadataClaimNames.ISSUER, "not an url"));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageStartingWith("issuer must be a valid URL");
|
||||
.hasMessage("issuer must be a valid URL");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingAuthorizationEndpointThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenMissingAuthorizationEndpointThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.AUTHORIZATION_ENDPOINT));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
@@ -209,8 +211,8 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenAuthorizationEndpointIsNotAnUrlThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenAuthorizationEndpointNotUrlThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.put(OidcProviderMetadataClaimNames.AUTHORIZATION_ENDPOINT, "not an url"));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
@@ -219,8 +221,8 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingTokenEndpointThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenMissingTokenEndpointThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.TOKEN_ENDPOINT));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
@@ -229,8 +231,8 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenTokenEndpointIsNotAnUrlThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenTokenEndpointNotUrlThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.put(OidcProviderMetadataClaimNames.TOKEN_ENDPOINT, "not an url"));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
@@ -239,48 +241,100 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingJwksUriThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenMissingJwksUriThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.JWKS_URI));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("jwkSetUri cannot be null");
|
||||
.hasMessage("jwksUri cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWheJwksUriIsNotAnUrlThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenJwksUriNotUrlThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.put(OidcProviderMetadataClaimNames.JWKS_URI, "not an url"));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageStartingWith("jwkSetUri must be a valid URL");
|
||||
.hasMessageStartingWith("jwksUri must be a valid URL");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingResponseTypesThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenMissingResponseTypesThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("responseTypes cannot be empty");
|
||||
.hasMessage("responseTypes cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingSubjectTypesThenThrowsException() {
|
||||
OidcProviderConfiguration.Builder builder = minimalConfigurationBuilder
|
||||
public void buildWhenResponseTypesNotListThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> {
|
||||
claims.remove(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED);
|
||||
claims.put(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED, "code");
|
||||
});
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("responseTypes must be of type List");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenResponseTypesEmptyListThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> {
|
||||
claims.remove(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED);
|
||||
claims.put(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED, Collections.emptyList());
|
||||
});
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("responseTypes cannot be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenMissingSubjectTypesThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED));
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("subjectTypes cannot be empty");
|
||||
.hasMessage("subjectTypes cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenSubjectTypesNotListThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> {
|
||||
claims.remove(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED);
|
||||
claims.put(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED, "public");
|
||||
});
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("subjectTypes must be of type List");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildWhenSubjectTypesEmptyListThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = this.minimalConfigurationBuilder
|
||||
.claims((claims) -> {
|
||||
claims.remove(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED);
|
||||
claims.put(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED, Collections.emptyList());
|
||||
});
|
||||
|
||||
assertThatThrownBy(builder::build)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("subjectTypes cannot be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void responseTypesWhenAddingOrRemovingThenCorrectValues() {
|
||||
OidcProviderConfiguration configuration = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration configuration = this.minimalConfigurationBuilder
|
||||
.responseType("should-be-removed")
|
||||
.responseTypes(responseTypes -> {
|
||||
responseTypes.clear();
|
||||
@@ -293,7 +347,7 @@ public class OidcProviderConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void responseTypesWhenNotPresentAndAddingThenCorrectValues() {
|
||||
OidcProviderConfiguration configuration = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration configuration = this.minimalConfigurationBuilder
|
||||
.claims(claims -> claims.remove(OidcProviderMetadataClaimNames.RESPONSE_TYPES_SUPPORTED))
|
||||
.responseTypes(responseTypes -> responseTypes.add("some-response-type"))
|
||||
.build();
|
||||
@@ -303,7 +357,7 @@ public class OidcProviderConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void subjectTypesWhenAddingOrRemovingThenCorrectValues() {
|
||||
OidcProviderConfiguration configuration = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration configuration = this.minimalConfigurationBuilder
|
||||
.subjectType("should-be-removed")
|
||||
.subjectTypes(subjectTypes -> {
|
||||
subjectTypes.clear();
|
||||
@@ -316,7 +370,7 @@ public class OidcProviderConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void scopesWhenAddingOrRemovingThenCorrectValues() {
|
||||
OidcProviderConfiguration configuration = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration configuration = this.minimalConfigurationBuilder
|
||||
.scope("should-be-removed")
|
||||
.scopes(scopes -> {
|
||||
scopes.clear();
|
||||
@@ -329,7 +383,7 @@ public class OidcProviderConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void grantTypesWhenAddingOrRemovingThenCorrectValues() {
|
||||
OidcProviderConfiguration configuration = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration configuration = this.minimalConfigurationBuilder
|
||||
.grantType("should-be-removed")
|
||||
.grantTypes(grantTypes -> {
|
||||
grantTypes.clear();
|
||||
@@ -342,7 +396,7 @@ public class OidcProviderConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void tokenEndpointAuthenticationMethodsWhenAddingOrRemovingThenCorrectValues() {
|
||||
OidcProviderConfiguration configuration = minimalConfigurationBuilder
|
||||
OidcProviderConfiguration configuration = this.minimalConfigurationBuilder
|
||||
.tokenEndpointAuthenticationMethod("should-be-removed")
|
||||
.tokenEndpointAuthenticationMethods(authMethods -> {
|
||||
authMethods.clear();
|
||||
@@ -355,24 +409,22 @@ public class OidcProviderConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void claimWhenNameIsNullThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = OidcProviderConfiguration.withClaims();
|
||||
assertThatThrownBy(() -> builder.claim(null, "value"))
|
||||
assertThatThrownBy(() -> OidcProviderConfiguration.withClaims().claim(null, "value"))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("name cannot be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void claimWhenValueIsNullThenThrowIllegalArgumentException() {
|
||||
OidcProviderConfiguration.Builder builder = OidcProviderConfiguration.withClaims();
|
||||
assertThatThrownBy(() -> builder.claim("claim-name", null))
|
||||
assertThatThrownBy(() -> OidcProviderConfiguration.withClaims().claim("claim-name", null))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("value cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void claimsWhenRemovingAClaimThenIsNotPresent() {
|
||||
public void claimsWhenRemovingClaimThenNotPresent() {
|
||||
OidcProviderConfiguration configuration =
|
||||
minimalConfigurationBuilder
|
||||
this.minimalConfigurationBuilder
|
||||
.grantType("some-grant-type")
|
||||
.claims((claims) -> claims.remove(OidcProviderMetadataClaimNames.GRANT_TYPES_SUPPORTED))
|
||||
.build();
|
||||
@@ -380,9 +432,9 @@ public class OidcProviderConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void claimsWhenAddingAClaimThenIsPresent() {
|
||||
public void claimsWhenAddingClaimThenPresent() {
|
||||
OidcProviderConfiguration configuration =
|
||||
minimalConfigurationBuilder
|
||||
this.minimalConfigurationBuilder
|
||||
.claims((claims) -> claims.put(OidcProviderMetadataClaimNames.GRANT_TYPES_SUPPORTED, "authorization_code"))
|
||||
.build();
|
||||
assertThat(configuration.getGrantTypes()).containsExactly("authorization_code");
|
||||
@@ -391,7 +443,7 @@ public class OidcProviderConfigurationTests {
|
||||
private static URL url(String urlString) {
|
||||
try {
|
||||
return new URL(urlString);
|
||||
} catch (MalformedURLException e) {
|
||||
} catch (Exception ex) {
|
||||
throw new IllegalArgumentException("urlString must be a valid URL and valid URI");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.security.oauth2.core.http.converter;
|
||||
package org.springframework.security.oauth2.core.oidc.http.converter;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
@@ -24,7 +24,6 @@ import org.springframework.mock.http.MockHttpOutputMessage;
|
||||
import org.springframework.mock.http.client.MockClientHttpResponse;
|
||||
import org.springframework.security.oauth2.core.oidc.OidcProviderConfiguration;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
@@ -48,17 +47,17 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setProviderConfigurationParametersConverterWhenConverterIsNullThenThrowIllegalArgumentException() {
|
||||
public void setProviderConfigurationParametersConverterWhenNullThenThrowIllegalArgumentException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> this.messageConverter.setProviderConfigurationParametersConverter(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setProviderConfigurationConverterWhenConverterIsNullThenThrowIllegalArgumentException() {
|
||||
public void setProviderConfigurationConverterWhenNullThenThrowIllegalArgumentException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> this.messageConverter.setProviderConfigurationConverter(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readInternalWhenSuccessfulProviderConfigurationOnlyRequiredParametersThenReadOidcProviderConfiguration() throws Exception {
|
||||
public void readInternalWhenRequiredParametersThenSuccess() throws Exception {
|
||||
// @formatter:off
|
||||
String providerConfigurationResponse = "{\n"
|
||||
+ " \"issuer\": \"https://example.com/issuer1\",\n"
|
||||
@@ -85,7 +84,7 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readInternalWhenSuccessfulProviderConfigurationThenReadOidcProviderConfiguration() throws Exception {
|
||||
public void readInternalWhenValidParametersThenSuccess() throws Exception {
|
||||
// @formatter:off
|
||||
String providerConfigurationResponse = "{\n"
|
||||
+ " \"issuer\": \"https://example.com/issuer1\",\n"
|
||||
@@ -96,7 +95,7 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
+ " \"response_types_supported\": [\"code\"],\n"
|
||||
+ " \"grant_types_supported\": [\"authorization_code\", \"client_credentials\"],\n"
|
||||
+ " \"subject_types_supported\": [\"public\"],\n"
|
||||
+ " \"token_endpoint_auth_methods_supported\": [\"basic\"],\n"
|
||||
+ " \"token_endpoint_auth_methods_supported\": [\"client_secret_basic\"],\n"
|
||||
+ " \"custom_claim\": \"value\",\n"
|
||||
+ " \"custom_collection_claim\": [\"value1\", \"value2\"]\n"
|
||||
+ "}\n";
|
||||
@@ -113,8 +112,8 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
assertThat(providerConfiguration.getResponseTypes()).containsExactly("code");
|
||||
assertThat(providerConfiguration.getGrantTypes()).containsExactlyInAnyOrder("authorization_code", "client_credentials");
|
||||
assertThat(providerConfiguration.getSubjectTypes()).containsExactly("public");
|
||||
assertThat(providerConfiguration.getTokenEndpointAuthenticationMethods()).containsExactly("basic");
|
||||
assertThat(providerConfiguration.getClaimAsString("custom_claim")).isEqualTo("value");
|
||||
assertThat(providerConfiguration.getTokenEndpointAuthenticationMethods()).containsExactly("client_secret_basic");
|
||||
assertThat(providerConfiguration.<String>getClaim("custom_claim")).isEqualTo("value");
|
||||
assertThat(providerConfiguration.getClaimAsStringList("custom_collection_claim")).containsExactlyInAnyOrder("value1", "value2");
|
||||
}
|
||||
|
||||
@@ -144,7 +143,7 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeInternalWhenOidcProviderConfigurationThenWriteTokenResponse() throws Exception {
|
||||
public void writeInternalWhenProviderConfigurationThenSuccess() {
|
||||
OidcProviderConfiguration providerConfiguration =
|
||||
OidcProviderConfiguration.withClaims()
|
||||
.issuer("https://example.com/issuer1")
|
||||
@@ -156,7 +155,7 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
.grantType("authorization_code")
|
||||
.grantType("client_credentials")
|
||||
.subjectType("public")
|
||||
.tokenEndpointAuthenticationMethod("basic")
|
||||
.tokenEndpointAuthenticationMethod("client_secret_basic")
|
||||
.claim("custom_claim", "value")
|
||||
.claim("custom_collection_claim", Arrays.asList("value1", "value2"))
|
||||
.build();
|
||||
@@ -173,14 +172,13 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
assertThat(providerConfigurationResponse).contains("\"response_types_supported\":[\"code\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"grant_types_supported\":[\"authorization_code\",\"client_credentials\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"subject_types_supported\":[\"public\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"token_endpoint_auth_methods_supported\":[\"basic\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"custom_claim\":\"value\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"custom_collection_claim\":[\"value1\",\"value2\"]");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void writeInternalWhenWriteFailsThenThrowsException() throws MalformedURLException {
|
||||
public void writeInternalWhenWriteFailsThenThrowsException() {
|
||||
String errorMessage = "this is not a valid converter";
|
||||
Converter<OidcProviderConfiguration, Map<String, Object>> failingConverter =
|
||||
source -> {
|
||||
@@ -190,10 +188,10 @@ public class OidcProviderConfigurationHttpMessageConverterTests {
|
||||
|
||||
OidcProviderConfiguration providerConfiguration =
|
||||
OidcProviderConfiguration.withClaims()
|
||||
.issuer("https://example.com")
|
||||
.authorizationEndpoint("https://example.com")
|
||||
.tokenEndpoint("https://example.com")
|
||||
.jwksUri("https://example.com")
|
||||
.issuer("https://example.com/issuer1")
|
||||
.authorizationEndpoint("https://example.com/issuer1/oauth2/authorize")
|
||||
.tokenEndpoint("https://example.com/issuer1/oauth2/token")
|
||||
.jwksUri("https://example.com/issuer1/oauth2/jwks")
|
||||
.responseType("code")
|
||||
.subjectType("public")
|
||||
.build();
|
||||
@@ -17,8 +17,6 @@ package org.springframework.security.oauth2.server.authorization.config;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
@@ -28,41 +26,42 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
* @author Daniel Garnier-Moiroux
|
||||
*/
|
||||
public class ProviderSettingsTests {
|
||||
|
||||
@Test
|
||||
public void constructorWhenDefaultThenDefaultsAreSetAndIssuerIsNotSet() {
|
||||
public void constructorWhenDefaultThenDefaultsAreSet() {
|
||||
ProviderSettings providerSettings = new ProviderSettings();
|
||||
|
||||
assertThat(providerSettings.issuer()).isNull();
|
||||
assertThat(providerSettings.authorizationEndpoint()).isEqualTo("/oauth2/authorize");
|
||||
assertThat(providerSettings.tokenEndpoint()).isEqualTo("/oauth2/token");
|
||||
assertThat(providerSettings.jwkSetEndpoint()).isEqualTo("/oauth2/jwks");
|
||||
assertThat(providerSettings.jwksEndpoint()).isEqualTo("/oauth2/jwks");
|
||||
assertThat(providerSettings.tokenRevocationEndpoint()).isEqualTo("/oauth2/revoke");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void settingsWhenProvidedThenSet() throws MalformedURLException {
|
||||
String authorizationEndpoint = "/my-endpoints/authorize";
|
||||
String tokenEndpoint = "/my-endpoints/token";
|
||||
String jwksEndpoint = "/my-endpoints/jwks";
|
||||
String tokenRevocationEndpoint = "/my-endpoints/revoke";
|
||||
String issuer = "https://example.com/9000";
|
||||
public void settingsWhenProvidedThenSet() {
|
||||
String authorizationEndpoint = "/oauth2/v1/authorize";
|
||||
String tokenEndpoint = "/oauth2/v1/token";
|
||||
String jwksEndpoint = "/oauth2/v1/jwks";
|
||||
String tokenRevocationEndpoint = "/oauth2/v1/revoke";
|
||||
String issuer = "https://example.com:9000";
|
||||
|
||||
ProviderSettings providerSettings = new ProviderSettings()
|
||||
.issuer(issuer)
|
||||
.authorizationEndpoint(authorizationEndpoint)
|
||||
.tokenEndpoint(tokenEndpoint)
|
||||
.jwkSetEndpoint(jwksEndpoint)
|
||||
.jwksEndpoint(jwksEndpoint)
|
||||
.tokenRevocationEndpoint(tokenRevocationEndpoint);
|
||||
|
||||
assertThat(providerSettings.issuer()).isEqualTo(issuer);
|
||||
assertThat(providerSettings.authorizationEndpoint()).isEqualTo(authorizationEndpoint);
|
||||
assertThat(providerSettings.tokenEndpoint()).isEqualTo(tokenEndpoint);
|
||||
assertThat(providerSettings.jwkSetEndpoint()).isEqualTo(jwksEndpoint);
|
||||
assertThat(providerSettings.jwksEndpoint()).isEqualTo(jwksEndpoint);
|
||||
assertThat(providerSettings.tokenRevocationEndpoint()).isEqualTo(tokenRevocationEndpoint);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void settingWhenCalledThenReturnTokenSettings() {
|
||||
public void settingWhenCustomThenReturnAllSettings() {
|
||||
ProviderSettings providerSettings = new ProviderSettings()
|
||||
.setting("name1", "value1")
|
||||
.settings(settings -> settings.put("name2", "value2"));
|
||||
@@ -73,54 +72,42 @@ public class ProviderSettingsTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenNullThenThrowsIllegalArgumentException() {
|
||||
public void issuerWhenNullThenThrowIllegalArgumentException() {
|
||||
ProviderSettings settings = new ProviderSettings();
|
||||
assertThatThrownBy(() -> settings.issuer(null))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("issuer cannot be null");
|
||||
.hasMessage("value cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authorizationEndpointWhenNullThenThrowsIllegalArgumentException() {
|
||||
public void authorizationEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||
ProviderSettings settings = new ProviderSettings();
|
||||
assertThatThrownBy(() -> settings.authorizationEndpoint(null))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("authorizationEndpoint cannot be empty");
|
||||
assertThatThrownBy(() -> settings.authorizationEndpoint(""))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("authorizationEndpoint cannot be empty");
|
||||
.hasMessage("value cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenEndpointWhenNullThenThrowsIllegalArgumentException() {
|
||||
public void tokenEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||
ProviderSettings settings = new ProviderSettings();
|
||||
assertThatThrownBy(() -> settings.tokenEndpoint(null))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("tokenEndpoint cannot be empty");
|
||||
assertThatThrownBy(() -> settings.tokenEndpoint(""))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("tokenEndpoint cannot be empty");
|
||||
.hasMessage("value cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenRevocationEndpointWhenNullThenThrowsIllegalArgumentException() {
|
||||
public void tokenRevocationEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||
ProviderSettings settings = new ProviderSettings();
|
||||
assertThatThrownBy(() -> settings.tokenRevocationEndpoint(null))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("tokenRevocationEndpoint cannot be empty");
|
||||
assertThatThrownBy(() -> settings.tokenRevocationEndpoint(""))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("tokenRevocationEndpoint cannot be empty");
|
||||
.hasMessage("value cannot be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jwkSetEndpointWhenNullThenThrowsIllegalArgumentException() {
|
||||
public void jwksEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||
ProviderSettings settings = new ProviderSettings();
|
||||
assertThatThrownBy(() -> settings.jwkSetEndpoint(null))
|
||||
assertThatThrownBy(() -> settings.jwksEndpoint(null))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("jwkSetEndpoint cannot be empty");
|
||||
assertThatThrownBy(() -> settings.jwkSetEndpoint(""))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("jwkSetEndpoint cannot be empty");
|
||||
.hasMessage("value cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ import static org.mockito.Mockito.verifyNoInteractions;
|
||||
* @author Daniel Garnier-Moiroux
|
||||
*/
|
||||
public class OidcProviderConfigurationEndpointFilterTests {
|
||||
|
||||
@Test
|
||||
public void constructorWhenProviderSettingsNullThenThrowIllegalArgumentException() {
|
||||
assertThatThrownBy(() -> new OidcProviderConfigurationEndpointFilter(null))
|
||||
@@ -46,8 +47,10 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doFilterWhenRequestDoesNotMatchThenNotProcessed() throws Exception {
|
||||
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter(new ProviderSettings());
|
||||
public void doFilterWhenNotConfigurationRequestThenNotProcessed() throws Exception {
|
||||
OidcProviderConfigurationEndpointFilter filter =
|
||||
new OidcProviderConfigurationEndpointFilter(new ProviderSettings());
|
||||
|
||||
String requestUri = "/path";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
@@ -60,20 +63,38 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doFilterWhenSuccessThenConfigurationResponse() throws Exception {
|
||||
String authorizationEndpoint = "/my-endpoints/authorize";
|
||||
String tokenEndpoint = "/my-endpoints/token";
|
||||
String jwksEndpoint = "/my-endpoints/jwks";
|
||||
public void doFilterWhenConfigurationRequestPostThenNotProcessed() throws Exception {
|
||||
OidcProviderConfigurationEndpointFilter filter =
|
||||
new OidcProviderConfigurationEndpointFilter(new ProviderSettings());
|
||||
|
||||
String requestUri = OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("POST", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
filter.doFilter(request, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doFilterWhenConfigurationRequestThenConfigurationResponse() throws Exception {
|
||||
String authorizationEndpoint = "/oauth2/v1/authorize";
|
||||
String tokenEndpoint = "/oauth2/v1/token";
|
||||
String jwksEndpoint = "/oauth2/v1/jwks";
|
||||
|
||||
ProviderSettings providerSettings = new ProviderSettings()
|
||||
.issuer("https://example.com/issuer1")
|
||||
.authorizationEndpoint(authorizationEndpoint)
|
||||
.tokenEndpoint(tokenEndpoint)
|
||||
.jwkSetEndpoint(jwksEndpoint);
|
||||
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter(providerSettings);
|
||||
.jwksEndpoint(jwksEndpoint);
|
||||
OidcProviderConfigurationEndpointFilter filter =
|
||||
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", org.springframework.security.oauth2.server.authorization.web.OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI);
|
||||
request.setServletPath(org.springframework.security.oauth2.server.authorization.web.OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI);
|
||||
String requestUri = OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
@@ -84,29 +105,31 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
||||
assertThat(response.getContentType()).isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
String providerConfigurationResponse = response.getContentAsString();
|
||||
assertThat(providerConfigurationResponse).contains("\"issuer\":\"https://example.com/issuer1\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"authorization_endpoint\":\"https://example.com/issuer1/my-endpoints/authorize\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"token_endpoint\":\"https://example.com/issuer1/my-endpoints/token\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"jwks_uri\":\"https://example.com/issuer1/my-endpoints/jwks\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"authorization_endpoint\":\"https://example.com/issuer1/oauth2/v1/authorize\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"token_endpoint\":\"https://example.com/issuer1/oauth2/v1/token\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"jwks_uri\":\"https://example.com/issuer1/oauth2/v1/jwks\"");
|
||||
assertThat(providerConfigurationResponse).contains("\"scopes_supported\":[\"openid\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"response_types_supported\":[\"code\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"grant_types_supported\":[\"authorization_code\",\"client_credentials\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"grant_types_supported\":[\"authorization_code\",\"client_credentials\",\"refresh_token\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"subject_types_supported\":[\"public\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\"]");
|
||||
assertThat(providerConfigurationResponse).contains("\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\",\"client_secret_post\"]");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void doFilterWhenProviderSettingsWithInvalidIssuerThenThrowIllegalArgumentException() {
|
||||
public void doFilterWhenProviderSettingsWithInvalidIssuerThenThrowIllegalArgumentException() {
|
||||
ProviderSettings providerSettings = new ProviderSettings()
|
||||
.issuer("https://this is an invalid URL");
|
||||
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter(providerSettings);
|
||||
OidcProviderConfigurationEndpointFilter filter =
|
||||
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", org.springframework.security.oauth2.server.authorization.web.OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI);
|
||||
request.setServletPath(org.springframework.security.oauth2.server.authorization.web.OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI);
|
||||
String requestUri = OidcProviderConfigurationEndpointFilter.DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
assertThatThrownBy(() -> filter.doFilter(request, response, filterChain))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage("issuer must be a valid URL");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user