Skip to content

Commit 5fc9eff

Browse files
committed
Ability to modify OIDC provider configuration
Closes spring-projectsgh-616
1 parent 8b32ace commit 5fc9eff

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/web/OidcProviderConfigurationEndpointFilter.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import org.springframework.http.HttpMethod;
2828
import org.springframework.http.MediaType;
29+
import org.springframework.http.converter.HttpMessageConverter;
2930
import org.springframework.http.server.ServletServerHttpResponse;
3031
import org.springframework.security.oauth2.core.AuthorizationGrantType;
3132
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
@@ -59,7 +60,7 @@ public final class OidcProviderConfigurationEndpointFilter extends OncePerReques
5960

6061
private final ProviderSettings providerSettings;
6162
private final RequestMatcher requestMatcher;
62-
private final OidcProviderConfigurationHttpMessageConverter providerConfigurationHttpMessageConverter =
63+
private HttpMessageConverter<OidcProviderConfiguration> providerConfigurationHttpMessageConverter =
6364
new OidcProviderConfigurationHttpMessageConverter();
6465

6566
public OidcProviderConfigurationEndpointFilter(ProviderSettings providerSettings) {
@@ -103,6 +104,20 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
103104
providerConfiguration, MediaType.APPLICATION_JSON, httpResponse);
104105
}
105106

107+
/**
108+
* Sets the {@link HttpMessageConverter} used for converting the {@link OidcProviderConfiguration}
109+
* from and to HTTP requests and responses
110+
*
111+
* @param providerConfigurationHttpMessageConverter the {@link HttpMessageConverter} used for converting a
112+
* representation of the OpenID Provider Configuration from and to HTTP requests and responses
113+
*
114+
* @since 0.2.3
115+
*/
116+
public void setProviderConfigurationHttpMessageConverter(HttpMessageConverter<OidcProviderConfiguration> providerConfigurationHttpMessageConverter) {
117+
Assert.notNull(providerConfigurationHttpMessageConverter, "providerConfigurationHttpMessageConverter cannot be null");
118+
this.providerConfigurationHttpMessageConverter = providerConfigurationHttpMessageConverter;
119+
}
120+
106121
private static Consumer<List<String>> clientAuthenticationMethods() {
107122
return (authenticationMethods) -> {
108123
authenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_BASIC.getValue());

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/oidc/web/OidcProviderConfigurationEndpointFilterTests.java

+63
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
*/
1616
package org.springframework.security.oauth2.server.authorization.oidc.web;
1717

18+
import java.util.Arrays;
19+
import java.util.HashMap;
20+
import java.util.Map;
21+
1822
import javax.servlet.FilterChain;
1923
import javax.servlet.http.HttpServletRequest;
2024
import javax.servlet.http.HttpServletResponse;
@@ -25,6 +29,7 @@
2529
import org.springframework.http.MediaType;
2630
import org.springframework.mock.web.MockHttpServletRequest;
2731
import org.springframework.mock.web.MockHttpServletResponse;
32+
import org.springframework.security.oauth2.core.oidc.http.converter.OidcProviderConfigurationHttpMessageConverter;
2833
import org.springframework.security.oauth2.server.authorization.config.ProviderSettings;
2934
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
3035
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
@@ -56,6 +61,15 @@ public void constructorWhenProviderSettingsNullThenThrowIllegalArgumentException
5661
.withMessage("providerSettings cannot be null");
5762
}
5863

64+
@Test
65+
public void setProviderConfigurationHttpMessageConverterWhenNullThenThrowIllegalArgumentException() {
66+
OidcProviderConfigurationEndpointFilter filter =
67+
new OidcProviderConfigurationEndpointFilter(ProviderSettings.builder().build());
68+
assertThatIllegalArgumentException()
69+
.isThrownBy(() -> filter.setProviderConfigurationHttpMessageConverter(null))
70+
.withMessage("providerConfigurationHttpMessageConverter cannot be null");
71+
}
72+
5973
@Test
6074
public void doFilterWhenNotConfigurationRequestThenNotProcessed() throws Exception {
6175
OidcProviderConfigurationEndpointFilter filter =
@@ -71,6 +85,55 @@ public void doFilterWhenNotConfigurationRequestThenNotProcessed() throws Excepti
7185

7286
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
7387
}
88+
@Test
89+
public void providerConfigurationHttpMessageConverterWhenCustomThenAbleToOverride() throws Exception{
90+
String issuer = "https://example.com/issuer1";
91+
String authorizationEndpoint = "/oauth2/v1/authorize";
92+
String tokenEndpoint = "/oauth2/v1/token";
93+
String jwkSetEndpoint = "/oauth2/v1/jwks";
94+
String userInfoEndpoint = "/userinfo";
95+
96+
ProviderSettings providerSettings = ProviderSettings.builder()
97+
.issuer(issuer)
98+
.authorizationEndpoint(authorizationEndpoint)
99+
.tokenEndpoint(tokenEndpoint)
100+
.jwkSetEndpoint(jwkSetEndpoint)
101+
.oidcUserInfoEndpoint(userInfoEndpoint)
102+
.build();
103+
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
104+
OidcProviderConfigurationEndpointFilter filter =
105+
new OidcProviderConfigurationEndpointFilter(providerSettings);
106+
107+
OidcProviderConfigurationHttpMessageConverter httpMessageConverter = new OidcProviderConfigurationHttpMessageConverter();
108+
httpMessageConverter.setProviderConfigurationParametersConverter(oidcProviderConfiguration -> {
109+
Map<String, Object> claims = new HashMap<>(oidcProviderConfiguration.getClaims());
110+
claims.put("scopes_supported", Arrays.asList("openid", "value1"));
111+
return claims;
112+
});
113+
filter.setProviderConfigurationHttpMessageConverter(httpMessageConverter);
114+
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
115+
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
116+
request.setServletPath(requestUri);
117+
MockHttpServletResponse response = new MockHttpServletResponse();
118+
FilterChain filterChain = mock(FilterChain.class);
119+
filter.doFilter(request, response, filterChain);
120+
121+
verifyNoInteractions(filterChain);
122+
assertThat(response.getContentType()).isEqualTo(MediaType.APPLICATION_JSON_VALUE);
123+
String providerConfigurationResponse = response.getContentAsString();
124+
assertThat(providerConfigurationResponse).contains("\"issuer\":\"https://example.com/issuer1\"");
125+
assertThat(providerConfigurationResponse).contains("\"authorization_endpoint\":\"https://example.com/issuer1/oauth2/v1/authorize\"");
126+
assertThat(providerConfigurationResponse).contains("\"token_endpoint\":\"https://example.com/issuer1/oauth2/v1/token\"");
127+
assertThat(providerConfigurationResponse).contains("\"jwks_uri\":\"https://example.com/issuer1/oauth2/v1/jwks\"");
128+
assertThat(providerConfigurationResponse).contains("\"scopes_supported\":[\"openid\",\"value1\"]");
129+
assertThat(providerConfigurationResponse).contains("\"response_types_supported\":[\"code\"]");
130+
assertThat(providerConfigurationResponse).contains("\"grant_types_supported\":[\"authorization_code\",\"client_credentials\",\"refresh_token\"]");
131+
assertThat(providerConfigurationResponse).contains("\"subject_types_supported\":[\"public\"]");
132+
assertThat(providerConfigurationResponse).contains("\"id_token_signing_alg_values_supported\":[\"RS256\"]");
133+
assertThat(providerConfigurationResponse).contains("\"userinfo_endpoint\":\"https://example.com/issuer1/userinfo\"");
134+
assertThat(providerConfigurationResponse).contains("\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\",\"client_secret_post\",\"client_secret_jwt\",\"private_key_jwt\"]");
135+
}
136+
74137

75138
@Test
76139
public void doFilterWhenConfigurationRequestPostThenNotProcessed() throws Exception {

0 commit comments

Comments
 (0)