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 2014/12/09 11:19:34 UTC

cxf git commit: Updating Hawk token validator to support AS letting RS finish the signature validation

Repository: cxf
Updated Branches:
  refs/heads/master 4b44512d8 -> 99653ffc5


Updating Hawk token validator to support AS letting RS finish the signature validation


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/99653ffc
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/99653ffc
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/99653ffc

Branch: refs/heads/master
Commit: 99653ffc54553228e401c46166c57971beefa88b
Parents: 4b44512
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Tue Dec 9 10:18:57 2014 +0000
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Tue Dec 9 10:18:57 2014 +0000

----------------------------------------------------------------------
 .../oauth2/common/AccessTokenValidation.java    | 22 ++++-
 .../cxf/rs/security/oauth2/common/Client.java   |  9 ++
 .../oauth2/filters/OAuthRequestFilter.java      |  9 ++
 .../services/AccessTokenValidatorService.java   |  8 +-
 .../hawk/AbstractHawkAccessTokenValidator.java  | 99 ++++++++++++++++++++
 .../tokens/hawk/HawkAccessTokenValidator.java   | 84 ++++-------------
 .../hawk/HawkAccessTokenValidatorClient.java    | 38 ++++++++
 7 files changed, 196 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenValidation.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenValidation.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenValidation.java
index 2217b0d..3d4ea28 100644
--- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenValidation.java
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenValidation.java
@@ -18,8 +18,10 @@
  */
 package org.apache.cxf.rs.security.oauth2.common;
 
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -35,6 +37,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 @XmlRootElement
 public class AccessTokenValidation {
     private String clientId;
+    private String clientIpAddress;
     private UserSubject clientSubject;
     
     private String tokenKey;
@@ -45,6 +48,7 @@ public class AccessTokenValidation {
     private UserSubject tokenSubject;
     private List<OAuthPermission> tokenScopes = new LinkedList<OAuthPermission>();
     private String audience;
+    private Map<String, String> extraProps = new HashMap<String, String>();
     
     public AccessTokenValidation() {
         
@@ -53,7 +57,7 @@ public class AccessTokenValidation {
     public AccessTokenValidation(ServerAccessToken token) {
         this.clientId = token.getClient().getClientId();
         this.clientSubject = token.getClient().getSubject();
-        
+        this.clientIpAddress = token.getClient().getClientIpAddress();
         this.tokenKey = token.getTokenKey();
         this.tokenType = token.getTokenType();
         this.tokenGrantType = token.getGrantType();
@@ -129,5 +133,21 @@ public class AccessTokenValidation {
     public void setAudience(String audience) {
         this.audience = audience;
     }
+
+    public String getClientIpAddress() {
+        return clientIpAddress;
+    }
+
+    public void setClientIpAddress(String clientIpAddress) {
+        this.clientIpAddress = clientIpAddress;
+    }
+
+    public Map<String, String> getExtraProps() {
+        return extraProps;
+    }
+
+    public void setExtraProps(Map<String, String> extraProps) {
+        this.extraProps = extraProps;
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java
index f87370b..494a00d 100644
--- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java
@@ -33,6 +33,7 @@ public class Client implements Serializable {
     
     private String clientId;
     private String clientSecret;
+    private String clientIpAddress;
     
     private String applicationName;
     private String applicationDescription;
@@ -295,4 +296,12 @@ public class Client implements Serializable {
     public void setApplicationCertificates(List<String> applicationCertificates) {
         this.applicationCertificates = applicationCertificates;
     }
+
+    public String getClientIpAddress() {
+        return clientIpAddress;
+    }
+
+    public void setClientIpAddress(String clientIpAddress) {
+        this.clientIpAddress = clientIpAddress;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/filters/OAuthRequestFilter.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/filters/OAuthRequestFilter.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/filters/OAuthRequestFilter.java
index fb63639..e8c052c 100644
--- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/filters/OAuthRequestFilter.java
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/filters/OAuthRequestFilter.java
@@ -110,6 +110,15 @@ public class OAuthRequestFilter extends AbstractAccessTokenValidator
             throw new WebApplicationException(403);
         }
       
+        if (accessTokenV.getClientIpAddress() != null) {
+            String remoteAddress = getMessageContext().getHttpServletRequest().getRemoteAddr();
+            if (remoteAddress == null || accessTokenV.getClientIpAddress().matches(remoteAddress)) {
+                String message = "Client IP Address is invalid";
+                LOG.warning(message);
+                throw new WebApplicationException(403);
+            }
+        }
+        
         // Create the security context and make it available on the message
         SecurityContext sc = createSecurityContext(req, accessTokenV);
         m.put(SecurityContext.class, sc);

http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidatorService.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidatorService.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidatorService.java
index e89b994..6f80679 100644
--- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidatorService.java
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidatorService.java
@@ -20,11 +20,11 @@ package org.apache.cxf.rs.security.oauth2.services;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Encoded;
-import javax.ws.rs.FormParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
 
 import org.apache.cxf.rs.security.oauth2.common.AccessTokenValidation;
 import org.apache.cxf.rs.security.oauth2.utils.AuthorizationUtils;
@@ -35,12 +35,12 @@ public class AccessTokenValidatorService extends AbstractAccessTokenValidator {
     @POST
     @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    public AccessTokenValidation getTokenValidationInfo(
-        @FormParam(OAuthConstants.AUTHORIZATION_SCHEME_TYPE) String authScheme, 
-        @Encoded @FormParam(OAuthConstants.AUTHORIZATION_SCHEME_DATA) String authSchemeData) {
+    public AccessTokenValidation getTokenValidationInfo(@Encoded MultivaluedMap<String, String> params) {
         if (getMessageContext().getSecurityContext().getUserPrincipal() == null) {
             AuthorizationUtils.throwAuthorizationFailure(supportedSchemes, realm);
         }
+        String authScheme = params.getFirst(OAuthConstants.AUTHORIZATION_SCHEME_TYPE);
+        String authSchemeData  = params.getFirst(OAuthConstants.AUTHORIZATION_SCHEME_DATA);
         return super.getAccessTokenValidation(authScheme, authSchemeData);
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/AbstractHawkAccessTokenValidator.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/AbstractHawkAccessTokenValidator.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/AbstractHawkAccessTokenValidator.java
new file mode 100644
index 0000000..dbecb50
--- /dev/null
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/AbstractHawkAccessTokenValidator.java
@@ -0,0 +1,99 @@
+/**
+ * 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.oauth2.tokens.hawk;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.common.util.Base64Exception;
+import org.apache.cxf.common.util.Base64Utility;
+import org.apache.cxf.common.util.crypto.HmacUtils;
+import org.apache.cxf.jaxrs.ext.MessageContext;
+import org.apache.cxf.rs.security.oauth2.client.HttpRequestProperties;
+import org.apache.cxf.rs.security.oauth2.common.AccessTokenValidation;
+import org.apache.cxf.rs.security.oauth2.provider.AccessTokenValidator;
+import org.apache.cxf.rs.security.oauth2.provider.OAuthServiceException;
+import org.apache.cxf.rs.security.oauth2.utils.AuthorizationUtils;
+import org.apache.cxf.rs.security.oauth2.utils.OAuthConstants;
+
+public abstract class AbstractHawkAccessTokenValidator implements AccessTokenValidator {
+    private NonceVerifier nonceVerifier;
+    public List<String> getSupportedAuthorizationSchemes() {
+        return Collections.singletonList(OAuthConstants.HAWK_AUTHORIZATION_SCHEME);
+    }
+
+    public AccessTokenValidation validateAccessToken(MessageContext mc,
+                                                     String authScheme, 
+                                                     String authSchemeData) throws OAuthServiceException {
+         
+        Map<String, String> schemeParams = getSchemeParameters(authSchemeData);
+        AccessTokenValidation atv = getAccessTokenValidation(mc, schemeParams, authSchemeData);
+        
+        String macKey = atv.getExtraProps().get(OAuthConstants.HAWK_TOKEN_KEY);
+        String macAlgo = atv.getExtraProps().get(OAuthConstants.HAWK_TOKEN_ALGORITHM);
+            
+        HttpRequestProperties httpProps = new HttpRequestProperties(mc.getUriInfo().getRequestUri(),
+                                                                    mc.getHttpServletRequest().getMethod());
+        HawkAuthorizationScheme macAuthInfo = new HawkAuthorizationScheme(httpProps, schemeParams);
+        String normalizedString = macAuthInfo.getNormalizedRequestString();
+        try {
+            HmacAlgorithm hmacAlgo = HmacAlgorithm.toHmacAlgorithm(macAlgo);
+            byte[] serverMacData = HmacUtils.computeHmac(macKey, hmacAlgo.getJavaName(), normalizedString); 
+                                                         
+            String clientMacString = schemeParams.get(OAuthConstants.HAWK_TOKEN_SIGNATURE);
+            byte[] clientMacData = Base64Utility.decode(clientMacString);
+            boolean validMac = Arrays.equals(serverMacData, clientMacData);
+            if (!validMac) {
+                AuthorizationUtils.throwAuthorizationFailure(Collections
+                    .singleton(OAuthConstants.HAWK_AUTHORIZATION_SCHEME));
+            }
+        } catch (Base64Exception e) {
+            throw new OAuthServiceException(OAuthConstants.SERVER_ERROR, e);
+        }
+        validateTimestampNonce(macKey, macAuthInfo.getTimestamp(), macAuthInfo.getNonce());
+        return atv;
+    }
+    
+    protected abstract AccessTokenValidation getAccessTokenValidation(MessageContext mc,
+                                                             Map<String, String> schemeParams,
+                                                             String authSchemeData);
+    
+    private static Map<String, String> getSchemeParameters(String authData) {
+        String[] attributePairs = authData.split(",");
+        Map<String, String> attributeMap = new HashMap<String, String>();
+        for (String pair : attributePairs) {
+            String[] pairValues = pair.trim().split("=", 2);
+            attributeMap.put(pairValues[0].trim(), pairValues[1].trim().replaceAll("\"", ""));
+        }
+        return attributeMap;
+    }
+    
+    protected void validateTimestampNonce(String tokenKey, String ts, String nonce) {
+        if (nonceVerifier != null) {
+            nonceVerifier.verifyNonce(tokenKey, nonce, ts);
+        }
+    }
+    
+    public void setNonceVerifier(NonceVerifier nonceVerifier) {
+        this.nonceVerifier = nonceVerifier;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidator.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidator.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidator.java
index 2321e4a..9955ffe 100644
--- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidator.java
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidator.java
@@ -18,96 +18,44 @@
  */
 package org.apache.cxf.rs.security.oauth2.tokens.hawk;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
-import org.apache.cxf.common.util.Base64Exception;
-import org.apache.cxf.common.util.Base64Utility;
-import org.apache.cxf.common.util.crypto.HmacUtils;
 import org.apache.cxf.jaxrs.ext.MessageContext;
-import org.apache.cxf.rs.security.oauth2.client.HttpRequestProperties;
 import org.apache.cxf.rs.security.oauth2.common.AccessTokenValidation;
 import org.apache.cxf.rs.security.oauth2.common.ServerAccessToken;
-import org.apache.cxf.rs.security.oauth2.provider.AccessTokenValidator;
 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.AuthorizationUtils;
 import org.apache.cxf.rs.security.oauth2.utils.OAuthConstants;
 
-public class HawkAccessTokenValidator implements AccessTokenValidator {
+public class HawkAccessTokenValidator extends AbstractHawkAccessTokenValidator {
     private OAuthDataProvider dataProvider;
-    private NonceVerifier nonceVerifier;
-    
-    public List<String> getSupportedAuthorizationSchemes() {
-        return Collections.singletonList(OAuthConstants.HAWK_AUTHORIZATION_SCHEME);
-    }
-
-    public AccessTokenValidation validateAccessToken(MessageContext mc,
-                                                     String authScheme, 
-                                                     String authSchemeData) throws OAuthServiceException {
-        HttpRequestProperties httpProps = new HttpRequestProperties(mc.getUriInfo().getRequestUri(),
-                                                                    mc.getHttpServletRequest().getMethod()); 
-        Map<String, String> schemeParams = getSchemeParameters(authSchemeData);
-        HawkAuthorizationScheme macAuthInfo = new HawkAuthorizationScheme(httpProps, schemeParams);
-        
-        HawkAccessToken macAccessToken = validateSchemeData(macAuthInfo,
-                                                           schemeParams.get(OAuthConstants.HAWK_TOKEN_SIGNATURE));
-        validateTimestampNonce(macAccessToken, macAuthInfo.getTimestamp(), macAuthInfo.getNonce());
-        return new AccessTokenValidation(macAccessToken);
-    }
-    
-    private static Map<String, String> getSchemeParameters(String authData) {
-        String[] attributePairs = authData.split(",");
-        Map<String, String> attributeMap = new HashMap<String, String>();
-        for (String pair : attributePairs) {
-            String[] pairValues = pair.trim().split("=", 2);
-            attributeMap.put(pairValues[0].trim(), pairValues[1].trim().replaceAll("\"", ""));
-        }
-        return attributeMap;
-    }
-    
-    protected void validateTimestampNonce(HawkAccessToken token, String ts, String nonce) {
-        if (nonceVerifier != null) {
-            nonceVerifier.verifyNonce(token.getTokenKey(), nonce, ts);
-        }
-    }
-    
-    private HawkAccessToken validateSchemeData(HawkAuthorizationScheme macAuthInfo,
-                                              String clientMacString) {
-        String macKey = macAuthInfo.getMacKey();
+    private boolean remoteSignatureValidation;
         
+    protected AccessTokenValidation getAccessTokenValidation(MessageContext mc,
+                                                             Map<String, String> schemeParams,
+                                                             String authSchemeData) {
+        String macKey = schemeParams.get(OAuthConstants.HAWK_TOKEN_ID);
         ServerAccessToken accessToken = dataProvider.getAccessToken(macKey);
         if (!(accessToken instanceof HawkAccessToken)) {
             throw new OAuthServiceException(OAuthConstants.SERVER_ERROR);
         }
         HawkAccessToken macAccessToken = (HawkAccessToken)accessToken;
+        AccessTokenValidation atv = new AccessTokenValidation(macAccessToken);
         
-        String normalizedString = macAuthInfo.getNormalizedRequestString();
-        try {
-            HmacAlgorithm hmacAlgo = HmacAlgorithm.toHmacAlgorithm(macAccessToken.getMacAlgorithm());
-            byte[] serverMacData = HmacUtils.computeHmac(
-                macAccessToken.getMacKey(), hmacAlgo.getJavaName(), normalizedString); 
-                                                         
-            byte[] clientMacData = Base64Utility.decode(clientMacString);
-            boolean validMac = Arrays.equals(serverMacData, clientMacData);
-            if (!validMac) {
-                AuthorizationUtils.throwAuthorizationFailure(Collections
-                    .singleton(OAuthConstants.HAWK_AUTHORIZATION_SCHEME));
-            }
-        } catch (Base64Exception e) {
-            throw new OAuthServiceException(OAuthConstants.SERVER_ERROR, e);
+        // OAuth2 Pop token introspection will likely support returning a JWE-encrypted key
+        if (!remoteSignatureValidation || mc.getSecurityContext().isSecure()) {
+            atv.getExtraProps().put(OAuthConstants.HAWK_TOKEN_KEY, macAccessToken.getMacKey());
+            atv.getExtraProps().put(OAuthConstants.HAWK_TOKEN_ALGORITHM, macAccessToken.getMacAlgorithm());
         }
-        return macAccessToken;
+        
+        return atv;
     }
     
+        
     public void setDataProvider(OAuthDataProvider dataProvider) {
         this.dataProvider = dataProvider;
     }
-
-    public void setNonceVerifier(NonceVerifier nonceVerifier) {
-        this.nonceVerifier = nonceVerifier;
+    public void setRemoteSignatureValidation(boolean remoteSignatureValidation) {
+        this.remoteSignatureValidation = remoteSignatureValidation;
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/99653ffc/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidatorClient.java
----------------------------------------------------------------------
diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidatorClient.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidatorClient.java
new file mode 100644
index 0000000..196e82b
--- /dev/null
+++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/tokens/hawk/HawkAccessTokenValidatorClient.java
@@ -0,0 +1,38 @@
+/**
+ * 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.oauth2.tokens.hawk;
+
+import java.util.Map;
+
+import org.apache.cxf.jaxrs.ext.MessageContext;
+import org.apache.cxf.rs.security.oauth2.common.AccessTokenValidation;
+import org.apache.cxf.rs.security.oauth2.provider.AccessTokenValidator;
+import org.apache.cxf.rs.security.oauth2.utils.OAuthConstants;
+
+public class HawkAccessTokenValidatorClient extends AbstractHawkAccessTokenValidator {
+    private AccessTokenValidator validator;
+        
+    protected AccessTokenValidation getAccessTokenValidation(MessageContext mc,
+                                                             Map<String, String> schemeParams,
+                                                             String authSchemeData) {
+        return validator.validateAccessToken(mc, OAuthConstants.HAWK_AUTHORIZATION_SCHEME, 
+                                             authSchemeData);
+    }
+    
+}