...
You can build the project (mvn clean install) for this handler by accessing its source here:
https://svngithub.com/wso2.org/reposproduct-esb/wso2/carbon/platform/tags/turing-chunk07/products/esb/4.8.1/modules/samples/integration-scenarios/starbucks_sample/BasicAuth-handlertree/v4.9.0/modules/samples/integration-scenarios/starbucks_sample/BasicAuth-handler
Note | |||||
---|---|---|---|---|---|
When building the sample using the source ensure you update
|
Alternatively, you can download the JAR file from the following location, copy it to the repository/component/lib directory, and restart the ESB:
https://svngithub.wso2.orgcom/repos/wso2/carbon/platform/tags/turing-chunk07/products/esb/4.8.1product-esb/blob/v4.9.0/modules/samples/integration-scenarios/starbucks_sample/bin/WSO2-REST-BasicAuth-Handler-1.0-SNAPSHOT.jar
You can now send a request to the secured API. For example, you can send it using cURL as the REST client:
...
Code Block | ||
---|---|---|
| ||
package org.wso2.handler; import org.apache.axis2.AxisFault; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.ConfigurationContextFactory; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.axis2.transport.http.HttpTransportProperties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.HttpHeaders; import org.apache.synapse.core.axis2.Axis2MessageContext; import org.wso2.carbon.identity.oauth2.stub.OAuth2TokenValidationServiceStub; import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO; import org.apache.synapse.ManagedLifecycle; import org.apache.synapse.MessageContext; import org.apache.synapse.core.SynapseEnvironment; import org.apache.synapse.rest.AbstractHandler; import org.wso2.carbon.identity.oauth2.stub.dto.OAuth2TokenValidationRequestDTO_OAuth2AccessToken; import java.util.Map; public class SimpleOauthHandler extends AbstractHandler implements ManagedLifecycle { private static final String CONSUMER_KEY_HEADER = "Bearer"; private static final String OAUTH_HEADER_SPLITTER = ","; private static final String CONSUMER_KEY_SEGMENT_DELIMITER = " "; private static final String OAUTH_TOKEN_VALIDATOR_SERVICE = "oauth2TokenValidationService"; private static final String IDP_LOGIN_USERNAME = "identityServerUserName"; private static final String IDP_LOGIN_PASSWORD = "identityServerPw"; private ConfigurationContext configContext; private static final Log log = LogFactory.getLog(SimpleOauthHandler.class); @Override public boolean handleRequest(MessageContext msgCtx) { if (this.getConfigContext() == null) { log.error("Configuration Context is null"); return false; } try{ //Read parameters from axis2.xml String identityServerUrl = msgCtx.getConfiguration().getAxisConfiguration().getParameter( OAUTH_TOKEN_VALIDATOR_SERVICE).getValue().toString(); String username = msgCtx.getConfiguration().getAxisConfiguration().getParameter( IDP_LOGIN_USERNAME).getValue().toString(); String password = msgCtx.getConfiguration().getAxisConfiguration().getParameter( IDP_LOGIN_PASSWORD).getValue().toString(); OAuth2TokenValidationServiceStub stub = new OAuth2TokenValidationServiceStub(this.getConfigContext(), identityServerUrl); ServiceClient client = stub._getServiceClient(); Options options = client.getOptions(); HttpTransportProperties.Authenticator authenticator = new HttpTransportProperties.Authenticator(); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.setPreemptiveAuthentication(true); options.setProperty(HTTPConstants.AUTHENTICATE, authenticator); client.setOptions(options); OAuth2TokenValidationRequestDTO dto = this.createOAuthValidatorDTO(msgCtx); return stub.validate(dto).getValid(); }catch(Exception e){ log.error("Error occurred while processing the message", e); return false; } } private OAuth2TokenValidationRequestDTO createOAuthValidatorDTO(MessageContext msgCtx) { OAuth2TokenValidationRequestDTO dto = new OAuth2TokenValidationRequestDTO(); Map headers = (Map) ((Axis2MessageContext) msgCtx).getAxis2MessageContext(). getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS); String apiKey = null; if (headers != null) { apiKey = extractCustomerKeyFromAuthHeader(headers); } OAuth2TokenValidationRequestDTO_OAuth2AccessToken token = new OAuth2TokenValidationRequestDTO_OAuth2AccessToken(); token.setTokenType("bearer"); token.setIdentifier(apiKey); dto.setAccessToken(token); return dto; } private String extractCustomerKeyFromAuthHeader(Map headersMap) { //From 1.0.7 version of this component onwards remove the OAuth authorization header from // the message is configurable. So we dont need to remove headers at this point. String authHeader = (String) headersMap.get(HttpHeaders.AUTHORIZATION); if (authHeader == null) { return null; } if (authHeader.startsWith("OAuth ") || authHeader.startsWith("oauth ")) { authHeader = authHeader.substring(authHeader.indexOf("o")); } String[] headers = authHeader.split(OAUTH_HEADER_SPLITTER); if (headers != null) { for (String header : headers) { String[] elements = header.split(CONSUMER_KEY_SEGMENT_DELIMITER); if (elements != null && elements.length > 1) { boolean isConsumerKeyHeaderAvailable = false; for (String element : elements) { if (!"".equals(element.trim())) { if (CONSUMER_KEY_HEADER.equals(element.trim())) { isConsumerKeyHeaderAvailable = true; } else if (isConsumerKeyHeaderAvailable) { return removeLeadingAndTrailing(element.trim()); } } } } } } return null; } private String removeLeadingAndTrailing(String base) { String result = base; if (base.startsWith("\"") || base.endsWith("\"")) { result = base.replace("\"", ""); } return result.trim(); } @Override public boolean handleResponse(MessageContext messageContext) { return true; } @Override public void init(SynapseEnvironment synapseEnvironment) { try { this.configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null); } catch (AxisFault axisFault) { log.error("Error occurred while initializing Configuration Context", axisFault); } } @Override public void destroy() { this.configContext = null; } private ConfigurationContext getConfigContext() { return configContext; } } |
Creating the API
You will now create an API named TestGoogle
that connects to the following endpoint: https://www.google.lk/search?q=wso2
- In the ESB Management Console, go to Manage -> Service Bus and click Source View.
Insert the following XML configuration into the source view before the closing
</definitions>
tag to create the TestGoogle API:Code Block language html/xml <api xmlns="http://ws.apache.org/ns/synapse" name="TestGoogle" context="/search"> <resource methods="GET"> <inSequence> <log level="full"> <property name="STATUS" value="***** REQUEST HITS IN SEQUENCE *****"/> </log> <send> <endpoint> <http method="get" uri-template="https://www.google.lk/search?q=wso2"/> </endpoint> </send> </inSequence> </resource> <handlers> <handler class="org.wso2.handler.SimpleOAuthHandlerSimpleOauthHandler"/> </handlers> </api>
Notice that the
<handlers>
tag contains the reference to the custom handler class.- Copy the custom
handler.jar
to the<ESB_HOME>/repository/components/libs
directory. Open
<ESB_HOME>/repository/conf/axis2/axis2.xml
and add the following parameters:Code Block language html/xml <!-- OAuth2 Token Validation Service --> <parameter name="oauth2TokenValidationService">https://localhost:9444/services/OAuth2TokenValidationService</parameter> <!-- Server credentials --> <parameter name="identityServerUserName">admin</parameter> <parameter name="identityServerPw">admin</parameter>
- Restart the ESB.
...
- Start WSO2 Identity Server and log into the management console.Click Manage -> OAuth and create an OAuth application
- On the Main tab, click Add under Service Providers, and then add a service provider.
- Note the access token URL and embed it in a cURL request to get the token. For example, use the following command and replace
<client-id>
and<client secret>
with the actual values:
curl -v -k -X POST --user <client-id>:<client secret> -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -d 'grant_type=password&username=admin&password=admin' https://localhost:9444/oauth2/token
...
Code Block | ||
---|---|---|
| ||
curl -v -k -H "Authorization: Basic YWRtaW46YWRtaW4=" https://localhost:8243/stockquote/view/IBM |
...