Repository: cxf Updated Branches: refs/heads/3.1.x-fixes 06d2a32ad -> 963a541fe
Injecting MessageContext into ResourceOwner handler too Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/963a541f Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/963a541f Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/963a541f Branch: refs/heads/3.1.x-fixes Commit: 963a541fe53a4d3f0481472c75fe6b7310c929c7 Parents: 06d2a32 Author: Sergey Beryozkin <sberyoz...@gmail.com> Authored: Thu Mar 2 17:38:53 2017 +0000 Committer: Sergey Beryozkin <sberyoz...@gmail.com> Committed: Thu Mar 2 17:52:20 2017 +0000 ---------------------------------------------------------------------- .../grants/owner/ResourceOwnerGrantHandler.java | 11 ++++++-- .../provider/AbstractOAuthDataProvider.java | 8 ++++++ .../oauth2/services/AbstractOAuthService.java | 28 ++++++++------------ .../oauth2/services/AccessTokenService.java | 13 +++++++-- .../security/oauth2/utils/OAuthConstants.java | 1 + .../rs/security/oauth2/utils/OAuthUtils.java | 18 +++++++++++++ 6 files changed, 58 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/963a541f/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java index 19e0f6b..4a5d03b 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java @@ -20,6 +20,7 @@ package org.apache.cxf.rs.security.oauth2.grants.owner; import javax.ws.rs.core.MultivaluedMap; +import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.rs.security.oauth2.common.Client; import org.apache.cxf.rs.security.oauth2.common.OAuthError; import org.apache.cxf.rs.security.oauth2.common.ServerAccessToken; @@ -27,6 +28,7 @@ import org.apache.cxf.rs.security.oauth2.common.UserSubject; import org.apache.cxf.rs.security.oauth2.grants.AbstractGrantHandler; import org.apache.cxf.rs.security.oauth2.provider.OAuthServiceException; import org.apache.cxf.rs.security.oauth2.utils.OAuthConstants; +import org.apache.cxf.rs.security.oauth2.utils.OAuthUtils; /** * The "resource owner" grant handler @@ -37,7 +39,7 @@ public class ResourceOwnerGrantHandler extends AbstractGrantHandler { public ResourceOwnerGrantHandler() { super(OAuthConstants.RESOURCE_OWNER_GRANT); } - + public ServerAccessToken createAccessToken(Client client, MultivaluedMap<String, String> params) throws OAuthServiceException { @@ -62,5 +64,10 @@ public class ResourceOwnerGrantHandler extends AbstractGrantHandler { this.loginHandler = loginHandler; } - + public void setMessageContext(MessageContext context) { + if (loginHandler != null) { + OAuthUtils.injectContextIntoOAuthProvider(context, loginHandler); + } + } + } http://git-wip-us.apache.org/repos/asf/cxf/blob/963a541f/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AbstractOAuthDataProvider.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AbstractOAuthDataProvider.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AbstractOAuthDataProvider.java index e39c9be..e5a8eba 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AbstractOAuthDataProvider.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AbstractOAuthDataProvider.java @@ -25,6 +25,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.ws.rs.core.MultivaluedMap; + import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.rs.security.jose.jwt.JwtClaims; import org.apache.cxf.rs.security.jose.jwt.JwtToken; @@ -311,6 +313,12 @@ public abstract class AbstractOAuthDataProvider implements OAuthDataProvider, Cl protected String getCurrentClientSecret() { return (String)messageContext.get(OAuthConstants.CLIENT_SECRET); } + protected MultivaluedMap<String, String> getCurrentRequestParams() { + @SuppressWarnings("unchecked") + MultivaluedMap<String, String> params = + (MultivaluedMap<String, String>)messageContext.get(OAuthConstants.TOKEN_REQUEST_PARAMS); + return params; + } protected RefreshToken updateRefreshToken(RefreshToken rt, ServerAccessToken at) { linkAccessTokenToRefreshToken(rt, at); saveRefreshToken(rt); http://git-wip-us.apache.org/repos/asf/cxf/blob/963a541f/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AbstractOAuthService.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AbstractOAuthService.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AbstractOAuthService.java index 79187d1..a3791f2 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AbstractOAuthService.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AbstractOAuthService.java @@ -18,7 +18,6 @@ */ package org.apache.cxf.rs.security.oauth2.services; -import java.lang.reflect.Method; import java.util.logging.Logger; import javax.ws.rs.core.Context; @@ -35,6 +34,7 @@ import org.apache.cxf.rs.security.oauth2.common.OAuthError; import org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider; import org.apache.cxf.rs.security.oauth2.provider.OAuthServiceException; import org.apache.cxf.rs.security.oauth2.utils.OAuthConstants; +import org.apache.cxf.rs.security.oauth2.utils.OAuthUtils; /** * Abstract OAuth service @@ -45,7 +45,6 @@ public abstract class AbstractOAuthService { private OAuthDataProvider dataProvider; private boolean blockUnsecureRequests; private boolean writeOptionalParameters = true; - private Method dataProviderContextMethod; public void setWriteOptionalParameters(boolean write) { writeOptionalParameters = write; @@ -57,14 +56,12 @@ public abstract class AbstractOAuthService { @Context public void setMessageContext(MessageContext context) { - this.mc = context; - if (dataProviderContextMethod != null) { - try { - dataProviderContextMethod.invoke(dataProvider, new Object[]{mc}); - } catch (Throwable t) { - throw new RuntimeException(t); - } - } + this.mc = context; + injectContextIntoOAuthProviders(); + } + + protected void injectContextIntoOAuthProviders() { + OAuthUtils.injectContextIntoOAuthProvider(mc, dataProvider); } public MessageContext getMessageContext() { @@ -73,13 +70,6 @@ public abstract class AbstractOAuthService { public void setDataProvider(OAuthDataProvider dataProvider) { this.dataProvider = dataProvider; - try { - dataProviderContextMethod = dataProvider.getClass().getMethod("setMessageContext", - new Class[]{MessageContext.class}); - } catch (Throwable t) { - // ignore - } - } public OAuthDataProvider getDataProvider() { @@ -101,6 +91,7 @@ public abstract class AbstractOAuthService { if (clientId != null) { mc.put(OAuthConstants.CLIENT_SECRET, params.getFirst(OAuthConstants.CLIENT_SECRET)); mc.put(OAuthConstants.GRANT_TYPE, params.getFirst(OAuthConstants.GRANT_TYPE)); + mc.put(OAuthConstants.TOKEN_REQUEST_PARAMS, params); return dataProvider.getClient(clientId); } LOG.fine("No valid client found as the given clientId is null"); @@ -152,4 +143,7 @@ public abstract class AbstractOAuthService { public void setBlockUnsecureRequests(boolean blockUnsecureRequests) { this.blockUnsecureRequests = blockUnsecureRequests; } + + + } http://git-wip-us.apache.org/repos/asf/cxf/blob/963a541f/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenService.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenService.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenService.java index 28410b8..b31d6b4 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenService.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenService.java @@ -19,6 +19,7 @@ package org.apache.cxf.rs.security.oauth2.services; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; @@ -59,13 +60,21 @@ public class AccessTokenService extends AbstractTokenService { public void setGrantHandlers(List<AccessTokenGrantHandler> handlers) { grantHandlers = handlers; } + + @Override + protected void injectContextIntoOAuthProviders() { + super.injectContextIntoOAuthProviders(); + for (AccessTokenGrantHandler grantHandler : grantHandlers) { + OAuthUtils.injectContextIntoOAuthProvider(getMessageContext(), grantHandler); + } + } /** * Sets a grant handler * @param handler the grant handler */ public void setGrantHandler(AccessTokenGrantHandler handler) { - grantHandlers.add(handler); + setGrantHandlers(Collections.singletonList(handler)); } public void setResponseFilters(List<AccessTokenResponseFilter> handlers) { @@ -174,4 +183,4 @@ public class AccessTokenService extends AbstractTokenService { return null; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/cxf/blob/963a541f/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthConstants.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthConstants.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthConstants.java index a14fa97..19c06e9 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthConstants.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthConstants.java @@ -44,6 +44,7 @@ public final class OAuthConstants { public static final String RESPONSE_MODE = "response_mode"; public static final String FORM_RESPONSE_MODE = "form_post"; // CXF-Specific + public static final String TOKEN_REQUEST_PARAMS = "token_request_params"; public static final String ACCESS_TOKEN_ISSUED_AT = "issued_at"; http://git-wip-us.apache.org/repos/asf/cxf/blob/963a541f/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthUtils.java ---------------------------------------------------------------------- diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthUtils.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthUtils.java index ab2e88c..fab0323 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthUtils.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/OAuthUtils.java @@ -18,6 +18,7 @@ */ package org.apache.cxf.rs.security.oauth2.utils; +import java.lang.reflect.Method; import java.security.Principal; import java.util.ArrayList; import java.util.Collections; @@ -64,6 +65,23 @@ public final class OAuthUtils { private OAuthUtils() { } + + public static void injectContextIntoOAuthProvider(MessageContext context, Object provider) { + Method dataProviderContextMethod = null; + try { + dataProviderContextMethod = provider.getClass().getMethod("setMessageContext", + new Class[]{MessageContext.class}); + } catch (Throwable t) { + // ignore + } + if (dataProviderContextMethod != null) { + try { + dataProviderContextMethod.invoke(provider, new Object[]{context}); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + } public static String setSessionToken(MessageContext mc) { return setSessionToken(mc, 0);