|
@@ -60,6 +60,7 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand
|
|
import org.springframework.security.web.authentication.WebAuthenticationDetails;
|
|
import org.springframework.security.web.authentication.WebAuthenticationDetails;
|
|
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
|
|
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
|
|
import org.springframework.util.StringUtils;
|
|
import org.springframework.util.StringUtils;
|
|
|
|
+import org.springframework.web.util.UriComponentsBuilder;
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
@@ -79,6 +80,7 @@ import static org.mockito.Mockito.when;
|
|
* @author Daniel Garnier-Moiroux
|
|
* @author Daniel Garnier-Moiroux
|
|
* @author Anoop Garlapati
|
|
* @author Anoop Garlapati
|
|
* @author Dmitriy Dubson
|
|
* @author Dmitriy Dubson
|
|
|
|
+ * @author Greg Li
|
|
* @since 0.0.1
|
|
* @since 0.0.1
|
|
*/
|
|
*/
|
|
public class OAuth2AuthorizationEndpointFilterTests {
|
|
public class OAuth2AuthorizationEndpointFilterTests {
|
|
@@ -178,7 +180,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.RESPONSE_TYPE,
|
|
OAuth2ParameterNames.RESPONSE_TYPE,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.removeParameter(OAuth2ParameterNames.RESPONSE_TYPE));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.removeParameter(OAuth2ParameterNames.RESPONSE_TYPE);
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -187,7 +192,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.RESPONSE_TYPE,
|
|
OAuth2ParameterNames.RESPONSE_TYPE,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.addParameter(OAuth2ParameterNames.RESPONSE_TYPE, "id_token"));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.addParameter(OAuth2ParameterNames.RESPONSE_TYPE, "id_token");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -196,7 +204,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.RESPONSE_TYPE,
|
|
OAuth2ParameterNames.RESPONSE_TYPE,
|
|
OAuth2ErrorCodes.UNSUPPORTED_RESPONSE_TYPE,
|
|
OAuth2ErrorCodes.UNSUPPORTED_RESPONSE_TYPE,
|
|
- request -> request.setParameter(OAuth2ParameterNames.RESPONSE_TYPE, "id_token"));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.setParameter(OAuth2ParameterNames.RESPONSE_TYPE, "id_token");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -205,7 +216,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.CLIENT_ID,
|
|
OAuth2ParameterNames.CLIENT_ID,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.removeParameter(OAuth2ParameterNames.CLIENT_ID));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.removeParameter(OAuth2ParameterNames.CLIENT_ID);
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -214,7 +228,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.CLIENT_ID,
|
|
OAuth2ParameterNames.CLIENT_ID,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.addParameter(OAuth2ParameterNames.CLIENT_ID, "client-2"));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.addParameter(OAuth2ParameterNames.CLIENT_ID, "client-2");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -223,7 +240,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.REDIRECT_URI,
|
|
OAuth2ParameterNames.REDIRECT_URI,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.addParameter(OAuth2ParameterNames.REDIRECT_URI, "https://example2.com"));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.addParameter(OAuth2ParameterNames.REDIRECT_URI, "https://example2.com");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -232,7 +252,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.SCOPE,
|
|
OAuth2ParameterNames.SCOPE,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.addParameter(OAuth2ParameterNames.SCOPE, "scope2"));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.addParameter(OAuth2ParameterNames.SCOPE, "scope2");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -241,7 +264,10 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
TestRegisteredClients.registeredClient().build(),
|
|
TestRegisteredClients.registeredClient().build(),
|
|
OAuth2ParameterNames.STATE,
|
|
OAuth2ParameterNames.STATE,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
OAuth2ErrorCodes.INVALID_REQUEST,
|
|
- request -> request.addParameter(OAuth2ParameterNames.STATE, "state2"));
|
|
|
|
|
|
+ request -> {
|
|
|
|
+ request.addParameter(OAuth2ParameterNames.STATE, "state2");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -271,6 +297,7 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
request -> {
|
|
request -> {
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE, "code-challenge");
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE, "code-challenge");
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE, "another-code-challenge");
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE, "another-code-challenge");
|
|
|
|
+ updateQueryString(request);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -283,6 +310,7 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
request -> {
|
|
request -> {
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE_METHOD, "S256");
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE_METHOD, "S256");
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE_METHOD, "S256");
|
|
request.addParameter(PkceParameterNames.CODE_CHALLENGE_METHOD, "S256");
|
|
|
|
+ updateQueryString(request);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -590,6 +618,7 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
|
|
|
|
MockHttpServletRequest request = createAuthorizationRequest(registeredClient);
|
|
MockHttpServletRequest request = createAuthorizationRequest(registeredClient);
|
|
request.addParameter("custom-param", "custom-value-1", "custom-value-2");
|
|
request.addParameter("custom-param", "custom-value-1", "custom-value-2");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
FilterChain filterChain = mock(FilterChain.class);
|
|
FilterChain filterChain = mock(FilterChain.class);
|
|
@@ -635,6 +664,7 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
|
|
|
|
MockHttpServletRequest request = createAuthorizationRequest(registeredClient);
|
|
MockHttpServletRequest request = createAuthorizationRequest(registeredClient);
|
|
request.setMethod("POST"); // OpenID Connect supports POST method
|
|
request.setMethod("POST"); // OpenID Connect supports POST method
|
|
|
|
+ request.setQueryString(null);
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
FilterChain filterChain = mock(FilterChain.class);
|
|
FilterChain filterChain = mock(FilterChain.class);
|
|
|
|
|
|
@@ -689,6 +719,7 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
request.addParameter(OAuth2ParameterNames.SCOPE,
|
|
request.addParameter(OAuth2ParameterNames.SCOPE,
|
|
StringUtils.collectionToDelimitedString(registeredClient.getScopes(), " "));
|
|
StringUtils.collectionToDelimitedString(registeredClient.getScopes(), " "));
|
|
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
|
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
|
|
|
+ updateQueryString(request);
|
|
|
|
|
|
return request;
|
|
return request;
|
|
}
|
|
}
|
|
@@ -706,6 +737,18 @@ public class OAuth2AuthorizationEndpointFilterTests {
|
|
return request;
|
|
return request;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static void updateQueryString(MockHttpServletRequest request) {
|
|
|
|
+ UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(request.getRequestURI());
|
|
|
|
+ request.getParameterMap().forEach((key, values) -> {
|
|
|
|
+ if (values.length > 0) {
|
|
|
|
+ for (String value : values) {
|
|
|
|
+ uriBuilder.queryParam(key, value);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ request.setQueryString(uriBuilder.build().getQuery());
|
|
|
|
+ }
|
|
|
|
+
|
|
private static String scopeCheckbox(String scope) {
|
|
private static String scopeCheckbox(String scope) {
|
|
return MessageFormat.format(
|
|
return MessageFormat.format(
|
|
"<input class=\"form-check-input\" type=\"checkbox\" name=\"scope\" value=\"{0}\" id=\"{0}\">",
|
|
"<input class=\"form-check-input\" type=\"checkbox\" name=\"scope\" value=\"{0}\" id=\"{0}\">",
|