Repository: cxf Updated Branches: refs/heads/master 816824971 -> 43097ecf7
[CXF-5607] Experimenting with the multiple oidc redirects Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/43097ecf Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/43097ecf Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/43097ecf Branch: refs/heads/master Commit: 43097ecf7a0e5dc4cba2bdd6053c8b199f38ab58 Parents: 8168249 Author: Sergey Beryozkin <[email protected]> Authored: Tue Jun 23 16:04:56 2015 +0100 Committer: Sergey Beryozkin <[email protected]> Committed: Tue Jun 23 16:04:56 2015 +0100 ---------------------------------------------------------------------- .../java/demo/jaxrs/server/BigQueryServer.java | 7 +- .../java/demo/jaxrs/server/BigQueryService.java | 2 +- .../main/webapp/WEB-INF/applicationContext.xml | 67 ++++++++++++++------ .../big_query/src/main/webapp/WEB-INF/web.xml | 8 +-- .../big_query/src/main/webapp/forms/login.jsp | 29 +++++++++ .../jaxrs/provider/json/JSONProviderTest.java | 38 ++++++----- .../oidc/rp/MemoryOidcRpStateManager.java | 63 ++++++++++++++++++ .../oidc/rp/OidcRpAuthenticationFilter.java | 11 +++- .../oidc/rp/OidcRpAuthenticationService.java | 27 +++++++- 9 files changed, 199 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryServer.java ---------------------------------------------------------------------- diff --git a/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryServer.java b/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryServer.java index 9b368b8..bfc8ee8 100644 --- a/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryServer.java +++ b/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryServer.java @@ -58,8 +58,7 @@ public class BigQueryServer { WebClient bigQueryClient = WebClient.create("https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/queries", Collections.singletonList(new JsonMapObjectProvider())); - bigQueryClient.accept(MediaType.APPLICATION_JSON); - bigQueryClient.type(MediaType.APPLICATION_JSON); + bigQueryClient.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON); List<ShakespeareText> texts = BigQueryService.getMatchingTexts(bigQueryClient, accessToken, "brave", "10"); @@ -88,8 +87,8 @@ public class BigQueryServer { WebClient accessTokenService = WebClient.create("https://www.googleapis.com/oauth2/v3/token", Arrays.asList(new OAuthJSONProvider(), new AccessTokenGrantWriter())); - accessTokenService.type(MediaType.APPLICATION_FORM_URLENCODED); - accessTokenService.accept(MediaType.APPLICATION_JSON); + accessTokenService.type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON); + return accessTokenService.post(grant, ClientAccessToken.class); } http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryService.java ---------------------------------------------------------------------- diff --git a/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryService.java b/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryService.java index 51f440e..d400ebe 100644 --- a/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryService.java +++ b/distribution/src/main/release/samples/jax_rs/big_query/src/main/java/demo/jaxrs/server/BigQueryService.java @@ -34,7 +34,7 @@ import org.apache.cxf.jaxrs.provider.json.JsonMapObject; import org.apache.cxf.rs.security.oauth2.common.ClientAccessToken; import org.apache.cxf.rs.security.oidc.rp.OidcClientTokenContext; -@Path("/search") +@Path("/") public class BigQueryService { private static final String BQ_SELECT = http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/applicationContext.xml ---------------------------------------------------------------------- diff --git a/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/applicationContext.xml b/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/applicationContext.xml index fc154bd..7f59a63 100644 --- a/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/applicationContext.xml +++ b/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/applicationContext.xml @@ -21,22 +21,6 @@ http://cxf.apache.org/schemas/configuration/security.xsd"> - <!-- - <http:conduit name="*.http-conduit"> - <http:client ConnectionTimeout="3000000" ReceiveTimeout="3000000"/> - <http:tlsClientParameters disableCNCheck="true"> - <sec:keyManagers keyPassword="skpass"> - <sec:keyStore type="JKS" password="sspass" - file="${project.build.directory}/${project.build.finalName}/WEB-INF/servicestore.jks"/> - </sec:keyManagers> - <sec:trustManagers> - <sec:keyStore type="JKS" password="sspass" - file="${project.build.directory}/${project.build.finalName}/WEB-INF/servicestore.jks"/> - </sec:trustManagers> - </http:tlsClientParameters> - </http:conduit> - --> - <!-- CXF Logging Feature --> <bean id="loggingFeature" class="org.apache.cxf.feature.LoggingFeature"/> @@ -102,13 +86,17 @@ <bean id="clientCodeStateManager" class="org.apache.cxf.rs.security.oauth2.client.MemoryClientCodeStateManager"/> <bean id="oidcRequestFilter" class="org.apache.cxf.rs.security.oidc.rp.OidcClientCodeRequestFilter"> <property name="clientCodeStateManager" ref="clientCodeStateManager"/> + <!-- Use it if no incremental authorization if enabled --> <property name="scopes" value="openid email profile https://www.googleapis.com/auth/bigquery.readonly"/> + <!-- + <property name="scopes" value="https://www.googleapis.com/auth/bigquery.readonly"/> + --> <property name="accessTokenServiceClient" ref="atServiceClient"/> <property name="userInfoClient" ref="userInfoClient"/> <property name="consumer" ref="consumer"/> <property name="authorizationServiceUri" value="https://accounts.google.com/o/oauth2/auth"/> <property name="startUri" value="search"/> - <property name="completeUri" value="search/complete"/> + <property name="completeUri" value="complete"/> </bean> <bean id="bigQueryService" class="demo.jaxrs.server.BigQueryService"> @@ -132,12 +120,15 @@ <property name="useClassNames" value="true"/> <property name="locationPrefix" value="/forms/"/> </bean> - - <jaxrs:server id="bigQueryServer" address="/"> + <jaxrs:server id="bigQueryServer" address="/search"> <jaxrs:serviceBeans> <ref bean="bigQueryService"/> </jaxrs:serviceBeans> <jaxrs:providers> + <!-- disable "oidcRpFilter" if the RP endpoint is not available + <ref bean="oidcRpFilter"/> + --> + <ref bean="oidcRequestFilter"/> <ref bean="searchView"/> <bean class="org.apache.cxf.rs.security.oauth2.client.ClientTokenContextProvider"/> @@ -146,7 +137,43 @@ <ref bean="loggingFeature"/> </jaxrs:features> </jaxrs:server> + <!-- + <bean id="stateManager" class="org.apache.cxf.rs.security.oidc.rp.MemoryOidcRpStateManager"/> + + <bean id="oidcRpFilter" class="org.apache.cxf.rs.security.oidc.rp.OidcRpAuthenticationFilter"> + <property name="stateManager" ref="stateManager"/> + <property name="rpServiceAddress" value="oidc/rp"/> + </bean> - + <bean id="oidcRpService" class="org.apache.cxf.rs.security.oidc.rp.OidcRpAuthenticationService"> + <property name="stateManager" ref="stateManager"/> + <property name="defaultLocation" value="/forms/startSearch.jsp"/> + </bean> + + <jaxrs:server id="oidcRpServer" address="/oidc"> + <jaxrs:serviceBeans> + <ref bean="oidcRpService"/> + </jaxrs:serviceBeans> + <jaxrs:providers> + <ref bean="rpOidcRequestFilter"/> + <bean class="org.apache.cxf.rs.security.oauth2.client.ClientTokenContextProvider"/> + </jaxrs:providers> + <jaxrs:features> + <ref bean="loggingFeature"/> + </jaxrs:features> + </jaxrs:server> + + <bean id="rpClientCodeStateManager" class="org.apache.cxf.rs.security.oauth2.client.MemoryClientCodeStateManager"/> + <bean id="rpOidcRequestFilter" class="org.apache.cxf.rs.security.oidc.rp.OidcClientCodeRequestFilter"> + <property name="clientCodeStateManager" ref="rpClientCodeStateManager"/> + <property name="scopes" value="openid email profile"/> + <property name="accessTokenServiceClient" ref="atServiceClient"/> + <property name="userInfoClient" ref="userInfoClient"/> + <property name="consumer" ref="consumer"/> + <property name="authorizationServiceUri" value="https://accounts.google.com/o/oauth2/auth"/> + <property name="startUri" value="rp"/> + <property name="completeUri" value="rp/complete"/> + </bean> + --> </beans> http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/web.xml b/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/web.xml index 05b9f32..9790ce7 100644 --- a/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/web.xml +++ b/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/WEB-INF/web.xml @@ -21,13 +21,7 @@ <servlet> <servlet-name>RESTServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> - <load-on-startup>1</load-on-startup> - <init-param> - <param-name>static-resources-list</param-name> - <param-value> - /index.html - </param-value> - </init-param> + <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>RESTServlet</servlet-name> http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/forms/login.jsp ---------------------------------------------------------------------- diff --git a/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/forms/login.jsp b/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/forms/login.jsp new file mode 100644 index 0000000..d829e42 --- /dev/null +++ b/distribution/src/main/release/samples/jax_rs/big_query/src/main/webapp/forms/login.jsp @@ -0,0 +1,29 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>Shakespeare Text Search Service Login</title> + <STYLE TYPE="text/css"> + <!-- + input {font-family:verdana, arial, helvetica, sans-serif;font-size:20px;line-height:40px;} + div.padded { + padding-left: 15em; + } + --> +</STYLE> +</head> +<body> +<div class="padded"> +<h1>Shakespeare Text Search Service Login</h1> +<em></em> +<p> + <table> + <form action="https://localhost:8080/bigquery/service/oidc/rp" method="POST"> + <tr> + <td colspan="2"> + <input type="submit" value=" Login with Google "/> + </td> + </tr> + </form> + </table> +</div> +</body> +</html> http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/JSONProviderTest.java ---------------------------------------------------------------------- diff --git a/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/JSONProviderTest.java b/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/JSONProviderTest.java index 7a8c4be..444aee5 100644 --- a/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/JSONProviderTest.java +++ b/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/JSONProviderTest.java @@ -215,19 +215,23 @@ public class JSONProviderTest extends Assert { public void testWriteCollectionAsPureArray() throws Exception { JSONProvider<ReportDefinition> provider = new JSONProvider<ReportDefinition>(); - provider.setSerializeAsArray(true); + //provider.setSerializeAsArray(true); + provider.setArrayKeys(Arrays.asList("parameterList")); provider.setDropRootElement(true); + provider.setOutDropElements(Arrays.asList("parameterList")); provider.setDropElementsInXmlStream(false); ReportDefinition r = new ReportDefinition(); - r.setReportName("report"); + //r.setReportName("report"); r.addParameterDefinition(new ParameterDefinition("param")); + r.addParameterDefinition(new ParameterDefinition("param2")); Method m = ReportService.class.getMethod("findReport", new Class<?>[]{}); ByteArrayOutputStream bos = new ByteArrayOutputStream(); provider.writeTo(r, m.getReturnType(), m.getGenericReturnType(), new Annotation[0], MediaType.APPLICATION_JSON_TYPE, new MetadataMap<String, Object>(), bos); - assertTrue(bos.toString().startsWith("[{\"parameterList\":")); + System.out.println(bos.toString()); + //assertTrue(bos.toString().startsWith("[{\"parameterList\":")); } @Test @@ -238,7 +242,7 @@ public class JSONProviderTest extends Assert { provider.setOutDropElements(Collections.singletonList("reportDefinition")); provider.setDropElementsInXmlStream(false); ReportDefinition r = new ReportDefinition(); - r.setReportName("report"); + //r.setReportName("report"); r.addParameterDefinition(new ParameterDefinition("param")); Method m = ReportService.class.getMethod("findReport", new Class<?>[]{}); @@ -260,7 +264,7 @@ public class JSONProviderTest extends Assert { provider.setDropRootElement(true); provider.setDropElementsInXmlStream(false); ReportDefinition r = new ReportDefinition(); - r.setReportName("report"); + //r.setReportName("report"); ParameterDefinition paramDef = new ParameterDefinition("param"); r.addParameterDefinition(paramDef); @@ -369,7 +373,7 @@ public class JSONProviderTest extends Assert { provider.setMarshallAsJaxbElement(asJaxbElement); provider.setUnmarshallAsJaxbElement(asJaxbElement); ReportDefinition r = new ReportDefinition(); - r.setReportName("report"); + //r.setReportName("report"); r.addParameterDefinition(new ParameterDefinition("param")); List<ReportDefinition> reports = Collections.singletonList(r); @@ -387,7 +391,7 @@ public class JSONProviderTest extends Assert { assertNotNull(reports2); assertEquals(1, reports2.size()); ReportDefinition rd = reports2.get(0); - assertEquals("report", rd.getReportName()); + //assertEquals("report", rd.getReportName()); List<ParameterDefinition> params = rd.getParameterList(); assertNotNull(params); @@ -1816,7 +1820,7 @@ public class JSONProviderTest extends Assert { @XmlRootElement public static class ReportDefinition { - private String reportName; + //private String reportName; private List<ParameterDefinition> parameterList; @@ -1825,16 +1829,16 @@ public class JSONProviderTest extends Assert { } public ReportDefinition(String reportName) { - this.reportName = reportName; - } - - public String getReportName() { - return reportName; - } - - public void setReportName(String reportName) { - this.reportName = reportName; + // this.reportName = reportName; } +// +// public String getReportName() { +// return reportName; +// } +// +// public void setReportName(String reportName) { +// this.reportName = reportName; +// } public List<ParameterDefinition> getParameterList() { return parameterList; http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/MemoryOidcRpStateManager.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/MemoryOidcRpStateManager.java b/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/MemoryOidcRpStateManager.java new file mode 100644 index 0000000..baa7e80 --- /dev/null +++ b/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/MemoryOidcRpStateManager.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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.apache.cxf.rs.security.oidc.rp; + +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +import javax.ws.rs.core.MultivaluedMap; + + +public class MemoryOidcRpStateManager implements OidcRpStateManager { + private ConcurrentHashMap<String, MultivaluedMap<String, String>> map = + new ConcurrentHashMap<String, MultivaluedMap<String, String>>(); + private ConcurrentHashMap<String, OidcClientTokenContext> map2 = + new ConcurrentHashMap<String, OidcClientTokenContext>(); + @Override + public void close() throws IOException { + // TODO Auto-generated method stub + + } + + @Override + public void setRequestState(String token, MultivaluedMap<String, String> state) { + map.put(token, state); + } + + @Override + public MultivaluedMap<String, String> removeRequestState(String token) { + return map.remove(token); + } + + @Override + public void setTokenContext(String contextKey, OidcClientTokenContext state) { + map2.put(contextKey, state); + + } + + @Override + public OidcClientTokenContext getTokenContext(String contextKey) { + return map2.get(contextKey); + } + + @Override + public OidcClientTokenContext removeTokenContext(String contextKey) { + return map2.remove(contextKey); + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationFilter.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationFilter.java b/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationFilter.java index c589161..01b95a3 100644 --- a/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationFilter.java +++ b/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationFilter.java @@ -20,8 +20,11 @@ package org.apache.cxf.rs.security.oidc.rp; import java.util.Map; +import javax.annotation.Priority; +import javax.ws.rs.Priorities; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; import javax.ws.rs.core.Cookie; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -34,6 +37,8 @@ import org.apache.cxf.jaxrs.utils.FormUtils; import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.apache.cxf.rs.security.oauth2.utils.OAuthUtils; +@PreMatching +@Priority(Priorities.AUTHENTICATION) public class OidcRpAuthenticationFilter implements ContainerRequestFilter { private OidcRpStateManager stateManager; @@ -46,7 +51,7 @@ public class OidcRpAuthenticationFilter implements ContainerRequestFilter { String token = OAuthUtils.generateRandomTokenKey(); MultivaluedMap<String, String> state = toRequestState(rc); stateManager.setRequestState(token, state); - UriBuilder ub = UriBuilder.fromUri(rpServiceAddress); + UriBuilder ub = rc.getUriInfo().getBaseUriBuilder().path(rpServiceAddress); ub.queryParam("state", token); rc.abortWith(Response.seeOther(ub.build()) .header(HttpHeaders.CACHE_CONTROL, "no-cache, no-store") @@ -79,9 +84,13 @@ public class OidcRpAuthenticationFilter implements ContainerRequestFilter { FormUtils.populateMapFromString(requestState, JAXRSUtils.getCurrentMessage(), body, "UTF-8", true); } + requestState.putSingle("location", rc.getUriInfo().getRequestUri().toString()); return requestState; } public void setRpServiceAddress(String rpServiceAddress) { this.rpServiceAddress = rpServiceAddress; } + public void setStateManager(OidcRpStateManager stateManager) { + this.stateManager = stateManager; + } } http://git-wip-us.apache.org/repos/asf/cxf/blob/43097ecf/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationService.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationService.java b/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationService.java index 5541e80..1d939fa 100644 --- a/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationService.java +++ b/rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/rp/OidcRpAuthenticationService.java @@ -24,19 +24,40 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; +import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.rs.security.oauth2.utils.OAuthUtils; @Path("rp") public class OidcRpAuthenticationService { private OidcRpStateManager stateManager; + private String defaultLocation; + @GET @Path("complete") - public Response completeAuthentication(@Context OidcClientTokenContext context) { + public Response completeAuthentication(@Context OidcClientTokenContext context, + @Context MessageContext mc) { String key = OAuthUtils.generateRandomTokenKey(); stateManager.setTokenContext(key, context); - URI uri = URI.create(context.getState().getFirst("location")); - return Response.seeOther(uri).header("SetCookie", "contextKey=" + key).build(); + URI redirectUri = null; + String location = context.getState().getFirst("location"); + if (location == null) { + String basePath = (String)mc.get("http.base.path"); + redirectUri = UriBuilder.fromUri(basePath).path(defaultLocation).build(); + } else { + redirectUri = URI.create(location); + } + return Response.seeOther(redirectUri).header("Set-Cookie", + "org.apache.cxf.websso.context=" + key + ";Path=/").build(); + } + + public void setDefaultLocation(String defaultLocation) { + this.defaultLocation = defaultLocation; + } + + public void setStateManager(OidcRpStateManager stateManager) { + this.stateManager = stateManager; } }
