You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2015/06/23 17:05:15 UTC
cxf git commit: [CXF-5607] Experimenting with the multiple oidc
redirects
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 <sb...@talend.com>
Authored: Tue Jun 23 16:04:56 2015 +0100
Committer: Sergey Beryozkin <sb...@talend.com>
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;
}
}