1515 */
1616package 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+
1822import javax .servlet .FilterChain ;
1923import javax .servlet .http .HttpServletRequest ;
2024import javax .servlet .http .HttpServletResponse ;
2529import org .springframework .http .MediaType ;
2630import org .springframework .mock .web .MockHttpServletRequest ;
2731import org .springframework .mock .web .MockHttpServletResponse ;
32+ import org .springframework .security .oauth2 .core .oidc .http .converter .OidcProviderConfigurationHttpMessageConverter ;
2833import org .springframework .security .oauth2 .server .authorization .config .ProviderSettings ;
2934import org .springframework .security .oauth2 .server .authorization .context .ProviderContext ;
3035import 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
6074public void doFilterWhenNotConfigurationRequestThenNotProcessed () throws Exception {
6175OidcProviderConfigurationEndpointFilter filter =
@@ -71,6 +85,55 @@ public void doFilterWhenNotConfigurationRequestThenNotProcessed() throws Excepti
7185
7286verify (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
76139public void doFilterWhenConfigurationRequestPostThenNotProcessed () throws Exception {
0 commit comments