Search code examples
javaapache-commonsapache-httpclient-4.xapache-commons-httpclient

HttpClientFormSubmit to get the OAUTH access token


I am using httpcomponents-client-4.2.5-bin for the ClientFormSubmit. I used the example to login to facebook using Oauth. My Oauth login has following steps

  1. first login to facebook using

    https://www.facebook.com/dialog/oauth?client_id=xxxxxxx&redirect_uri=http://localhost:8080/

  2. give the login details it redirects to the local host and have code parameter in url

I need to get that code value.

Code is

 try {
        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpGet httpget = new HttpGet("https://www.facebook.com/dialog/oauth?client_id=358300034293206&redirect_uri=http://localhost:8080/");

        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }
        System.out.println("Initial set of cookies:");
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        HttpPost httpost = new HttpPost("https://www.facebook.com/dialog/oauth?client_id=358300034293206&redirect_uri=http://localhost:8080/");

        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("email", "*****"));
        nvps.add(new BasicNameValuePair("pass", "*****"));

        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

        response = httpclient.execute(httpost);
        entity = response.getEntity();
        System.out.println("Double check we've got right page " + EntityUtils.toString(entity));

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }

        System.out.println("Post logon cookies:");
        cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        httpclient.getConnectionManager().shutdown();
    }catch(Exception e)
        {
            System.out.println( "Something bad just happened." );
            System.out.println( e );
            e.printStackTrace();
        }

    }

Is it possible to get the redirect url using request header? Thanks In Advance.


Solution

  • Using HttpClient 4.3 APIs

    CloseableHttpClient httpClient = HttpClients.createDefault();
    
    HttpClientContext context = HttpClientContext.create();
    HttpGet httpGet = new HttpGet("http://www.google.com/");
    CloseableHttpResponse httpResponse = httpClient.execute(httpGet, context);
    try {
        System.out.println("Response status: " + httpResponse.getStatusLine());
        System.out.println("Last request URI: " + context.getRequest().getRequestLine());
        URICollection redirectLocations = context.getRedirectLocations();
        if (redirectLocations != null) {
            System.out.println("All intermediate redirects: " + redirectLocations.getAll());
        }
        EntityUtils.consume(httpResponse.getEntity());
    } finally {
        httpResponse.close();
    }
    

    Using HttpClient 4.2 APIs

    DefaultHttpClient httpClient = new DefaultHttpClient();
    
    HttpContext context = new BasicHttpContext();
    HttpGet httpGet = new HttpGet("http://www.google.com/");
    try {
        HttpResponse httpResponse = httpClient.execute(httpGet, context);
        System.out.println("Response status: " + httpResponse.getStatusLine());
        HttpRequest req = (HttpRequest) context.getAttribute(
                ExecutionContext.HTTP_REQUEST);
        System.out.println("Last request URI: " + req.getRequestLine());
        RedirectLocations redirectLocations = (RedirectLocations) context.getAttribute(
                DefaultRedirectStrategy.REDIRECT_LOCATIONS);
        if (redirectLocations != null) {
            System.out.println("All intermediate redirects: " + redirectLocations.getAll());
        }
        EntityUtils.consume(httpResponse.getEntity());
    } finally {
        httpGet.releaseConnection();
    }