org.wso2.mobile.idp.proxy.handlers.AccessTokenHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.mobile.idp.proxy.handlers.AccessTokenHandler.java

Source

/*
 *  Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 *  WSO2 Inc. 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.wso2.mobile.idp.proxy.handlers;

import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpStatus;
import org.json.JSONException;
import org.json.JSONObject;
import org.wso2.mobile.idp.proxy.IdentityProxy;
import org.wso2.mobile.idp.proxy.beans.Token;
import org.wso2.mobile.idp.proxy.utils.IDPConstants;
import org.wso2.mobile.idp.proxy.utils.ServerUtilities;

import java.util.HashMap;
import java.util.Map;

/**
 * After receiving authorization code, this class can be used to obtain access token
 */
public class AccessTokenHandler extends Activity {
    private static final String TAG = "AccessTokenHandler";
    private String clientSecret = null;
    private String clientID = null;

    /**
     *
     * @param clientID
     * @param clientSecret
     */
    public AccessTokenHandler(String clientID, String clientSecret) {
        this.clientID = clientID;
        this.clientSecret = clientSecret;
    }

    /**
     *
     * @param code
     */
    public void obtainAccessToken(String code) {
        new NetworkCallTask().execute(code);
    }

    /**
     * AsyncTask to send authorization code and get access token and refresh token from authorization server
     */
    private class NetworkCallTask extends AsyncTask<String, Void, Map<String, String>> {

        public NetworkCallTask() {

        }

        /**
         *
         * @param params array of Strings first element as authorization code
         * @return
         */
        @Override
        protected Map<String, String> doInBackground(String... params) {
            if (params == null || params[0] == null) {
                return null;
            }
            String code = params[0];
            Log.d(TAG, code);
            Map<String, String> requestParams = new HashMap<String, String>();
            // TODO : consider extract these as constants
            requestParams.put(IDPConstants.GRANT_TYPE, IDPConstants.GRANT_TYPE_AUTHORIZATION_CODE);
            requestParams.put(IDPConstants.AUTHORIZATION_CODE, code);
            requestParams.put(IDPConstants.REDIRECT_URL, IDPConstants.CALL_BACK_URL);
            requestParams.put(IDPConstants.SCOPE, IDPConstants.OPENID);
            Map<String, String> responseParams = ServerUtilities.postData(
                    IdentityProxy.getInstance().getAccessTokenURL(), requestParams, clientID, clientSecret);
            return responseParams;
        }

        /**
         * access token, refresh token and id token will be received from response, After receiving tokens invoke receiveAccessToken method in CallBack
         * @param responseParams HashMap with two elements response and status
         */
        @Override
        protected void onPostExecute(Map<String, String> responseParams) {

            if (responseParams == null) {
                return;
            }

            String response = responseParams.get("response");
            String responseCode = responseParams.get("status");
            Log.d(TAG, response);

            try {
                JSONObject responseJSONObj = new JSONObject(response);
                IdentityProxy identityProxy = IdentityProxy.getInstance();

                if (responseCode != null && responseCode.equals(String.valueOf(HttpStatus.SC_OK))) {
                    String refreshToken = responseJSONObj.getString(IDPConstants.REFRESH_TOKEN);
                    String accessToken = responseJSONObj.getString(IDPConstants.ACCESS_TOKEN);
                    String idToken = responseJSONObj.getString(IDPConstants.ID_TOKEN);

                    idToken = new String(Base64.decodeBase64(idToken.getBytes()));

                    Token token = new Token();
                    token.setRefreshToken(refreshToken);
                    token.setIdToken(idToken);
                    token.setAccessToken(accessToken);
                    token.setDate();

                    identityProxy.receiveAccessToken(responseCode, "success", token);
                } else if (responseCode != null) {
                    String error = responseJSONObj.getString("error");
                    String errorDescription = responseJSONObj.getString("error_description");
                    Log.d(TAG, error);
                    Log.d(TAG, errorDescription);

                    identityProxy.receiveAccessToken(responseCode, errorDescription, null);
                }
            } catch (JSONException e) {
                Log.d(TAG, e.toString());
            }

        }
    }
}