com.networknt.client.oauth.TokenHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.networknt.client.oauth.TokenHelper.java

Source

/*
 * Copyright (c) 2016 Network New Technologies Inc.
 *
 * Licensed 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 com.networknt.client.oauth;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.networknt.client.Client;
import com.networknt.config.Config;
import com.networknt.exception.ClientException;
import com.networknt.utility.Constants;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.owasp.encoder.Encode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by steve on 02/09/16.
 */
public class TokenHelper {

    static final String BASIC = "Basic";
    static final String GRANT_TYPE = "grant_type";
    static final String CODE = "code";

    static final int HTTP_OK = 200;

    static final Logger logger = LoggerFactory.getLogger(TokenHelper.class);

    public static TokenResponse getToken(TokenRequest tokenRequest) throws ClientException {
        String url = tokenRequest.getServerUrl() + tokenRequest.getUri();
        TokenResponse tokenResponse = null;

        HttpPost httpPost = new HttpPost(url);
        httpPost.addHeader(Constants.AUTHORIZATION,
                getBasicAuthHeader(tokenRequest.getClientId(), tokenRequest.getClientSecret()));

        try {
            CloseableHttpClient client = Client.getInstance().getSyncClient();
            httpPost.setEntity(getEntity(tokenRequest));
            HttpResponse response = client.execute(httpPost);
            tokenResponse = handleResponse(response);

        } catch (JsonProcessingException jpe) {
            logger.error("JsonProcessingException: ", jpe);
            throw new ClientException("JsonProcessingException: ", jpe);
        } catch (UnsupportedEncodingException uee) {
            logger.error("UnsupportedEncodingException", uee);
            throw new ClientException("UnsupportedEncodingException: ", uee);
        } catch (IOException ioe) {
            logger.error("IOException: ", ioe);
            throw new ClientException("IOException: ", ioe);
        }
        return tokenResponse;
    }

    public static String getBasicAuthHeader(String clientId, String clientSecret) {
        return BASIC + " " + encodeCredentials(clientId, clientSecret);
    }

    public static String encodeCredentials(String clientId, String clientSecret) {
        String cred = "";
        if (clientSecret != null) {
            cred = clientId + ":" + clientSecret;
        } else {
            cred = clientId;
        }
        String encodedValue = null;
        byte[] encodedBytes = Base64.encodeBase64(cred.getBytes());
        encodedValue = new String(encodedBytes);
        return encodedValue;
    }

    public static String decodeCredentials(String cred) {
        return new String(Base64.decodeBase64(cred));
    }

    private static UrlEncodedFormEntity getEntity(TokenRequest request)
            throws JsonProcessingException, UnsupportedEncodingException {
        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair(GRANT_TYPE, request.getGrantType()));
        if (TokenRequest.AUTHORIZATION_CODE.equals(request.getGrantType())) {
            urlParameters.add(new BasicNameValuePair(CODE, ((AuthorizationCodeRequest) request).getAuthCode()));
            urlParameters.add(new BasicNameValuePair(TokenRequest.REDIRECT_URI,
                    ((AuthorizationCodeRequest) request).getRedirectUri()));
        }
        if (request.getScope() != null) {
            urlParameters
                    .add(new BasicNameValuePair(TokenRequest.SCOPE, StringUtils.join(request.getScope(), " ")));
        }
        return new UrlEncodedFormEntity(urlParameters);
    }

    private static TokenResponse handleResponse(HttpResponse response) throws ClientException {
        TokenResponse tokenResponse = null;
        int statusCode = response.getStatusLine().getStatusCode();
        try {
            if (statusCode == HTTP_OK) {
                tokenResponse = (TokenResponse) Config.getInstance().getMapper()
                        .readValue(response.getEntity().getContent(), TokenResponse.class);
            } else {
                logger.error("Error in token retrieval, response = "
                        + Encode.forJava(EntityUtils.toString(response.getEntity())));
                throw new ClientException("Error in token retrieval, status code = " + statusCode);
            }
        } catch (ParseException e) {
            logger.error("Error in token retrieval", e);
            throw new ClientException("Error in token retrieval", e);
        } catch (IOException e) {
            logger.error("Error in token retrieval", e);
            throw new ClientException("Error in token retrieval", e);
        } catch (RuntimeException e) {
            logger.error("Error in token retrieval", e);
            throw new ClientException("Error in token retrieval", e);
        }
        return tokenResponse;
    }

}