HTTPS connection with basic auth result into Unauthorized

前端 未结 4 1991
名媛妹妹
名媛妹妹 2020-12-06 07:05

I am trying to access Basecamp API from my Android/Java source code following way ....

import org.apache.http.HttpResponse;
import org.apache.http.StatusLine         


        
相关标签:
4条回答
  • 2020-12-06 07:29

    The HttpClient can't take the login creditals from the URI.
    You have to give them with specified methods.

    If you use HttpClient 4.x have a look on this:
    http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html

    But notice if you don't want to use the new version on the HttpClient (Android uses version 3.x), you should look here:
    http://hc.apache.org/httpclient-3.x/authentication.html

    That was the theory, now we use them:
    Basically we use HTTP, but if you want to use HTTPS, you have to edit the following assignment new HttpHost("www.google.com", 80, "http") into new HttpHost("www.google.com", 443, "https").

    Furthermore you have to edit the host (www.google.com) for your concerns.
    Notice: Only the full qualified domain name (FQDN) is needed not the full URI.

    HttpClient 3.x:

    package com.test;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpResponse;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import android.app.Activity;
    import android.os.Bundle;
    
    public class Test2aActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            try {
                HttpHost targetHost = new HttpHost("www.google.com", 80, "http");
    
                DefaultHttpClient httpclient = new DefaultHttpClient();
                try {
                    // Store the user login
                    httpclient.getCredentialsProvider().setCredentials(
                            new AuthScope(targetHost.getHostName(), targetHost.getPort()),
                            new UsernamePasswordCredentials("user", "password"));
    
                    // Create request
                    // You can also use the full URI http://www.google.com/
                    HttpGet httpget = new HttpGet("/");
                    // Execute request
                    HttpResponse response = httpclient.execute(targetHost, httpget);
    
                    HttpEntity entity = response.getEntity();
                    System.out.println(EntityUtils.toString(entity));
                } finally {
                    httpclient.getConnectionManager().shutdown();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    HttpClient 4.x:

    Attention: You will need the new HttpClient from Apache and additionally you must rearrange the order, that the jar-file is before the Android library.

    package com.test;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpResponse;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.AuthCache;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.protocol.ClientContext;
    import org.apache.http.impl.auth.BasicScheme;
    import org.apache.http.impl.client.BasicAuthCache;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.protocol.BasicHttpContext;
    import org.apache.http.util.EntityUtils;
    import android.app.Activity;
    import android.os.Bundle;
    
    public class TestActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            try {
                HttpHost targetHost = new HttpHost("www.google.com", 80, "http");
    
                DefaultHttpClient httpclient = new DefaultHttpClient();
                try {
                    // Store the user login
                    httpclient.getCredentialsProvider().setCredentials(
                            new AuthScope(targetHost.getHostName(), targetHost.getPort()),
                            new UsernamePasswordCredentials("user", "password"));
    
                    // Create AuthCache instance
                    AuthCache authCache = new BasicAuthCache();
                    // Generate BASIC scheme object and add it to the local
                    // auth cache
                    BasicScheme basicAuth = new BasicScheme();
                    authCache.put(targetHost, basicAuth);
    
                    // Add AuthCache to the execution context
                    BasicHttpContext localcontext = new BasicHttpContext();
                    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
    
                    // Create request
                    // You can also use the full URI http://www.google.com/
                    HttpGet httpget = new HttpGet("/");
                    // Execute request
                    HttpResponse response = httpclient.execute(targetHost, httpget, localcontext);
    
                    HttpEntity entity = response.getEntity();
                    System.out.println(EntityUtils.toString(entity));
                } finally {
                    httpclient.getConnectionManager().shutdown();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-06 07:34

    Finally I got it How to glue the code shown in above answer ...

    public static void performPost(String getUri, String xml) {
    
        String serverName = "*******";
        String username = "*******";
        String password = "********";
        String strResponse = null;
    
        try {
            HttpHost targetHost = new HttpHost(serverName, 443, "https");
    
            DefaultHttpClient httpclient = new DefaultHttpClient();
            try {
                // Store the user login
                httpclient.getCredentialsProvider().setCredentials(
                        new AuthScope(targetHost.getHostName(), targetHost.getPort()),
                        new UsernamePasswordCredentials(username, password));
    
                // Create AuthCache instance
                AuthCache authCache = new BasicAuthCache();
                // Generate BASIC scheme object and add it to the local
                // auth cache
                BasicScheme basicAuth = new BasicScheme();
                authCache.put(targetHost, basicAuth);
    
                // Add AuthCache to the execution context
                BasicHttpContext localcontext = new BasicHttpContext();
                localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
    
                // Create request
                // You can also use the full URI http://www.google.com/
                HttpPost httppost = new HttpPost(getUri);
                StringEntity se = new StringEntity(xml,HTTP.UTF_8);
                se.setContentType("text/xml");
                httppost.setEntity(se); 
                // Execute request
                HttpResponse response = httpclient.execute(targetHost, httppost, localcontext);
    
                HttpEntity entity = response.getEntity();
                strResponse = EntityUtils.toString(entity);
    
                StatusLine statusLine = response.getStatusLine();
                Log.i(TAG +": Post","statusLine : "+ statusLine.toString()); 
                Log.i(TAG +": Post","________**_________________________\n"+strResponse);
                Log.i(TAG +": Post","\n________**_________________________\n");
    
            } finally {
                httpclient.getConnectionManager().shutdown();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    One very important thing How your library should be arranged and which libraries you will required ...

    enter image description here

    From Here you will find this libraries.

    To add them in eclipse (Below Android sdk < 16)...

    Project properties -> java build path -> Libraries -> Add external JARs
    

    To arrange them in order in eclipse ...

    Project properties -> java build path -> order and export
    

    For above Android sdk >= 16 you will have to put these libraries into "libs" folder.

    0 讨论(0)
  • 2020-12-06 07:34

    Appendix on the brilliant and very helpfull answer of CSchulz:

    in http client 4.3 this:

    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
    

    does not work anymore (ClientContext.AUTH_CACHE is deprecated)

    use:

    import org.apache.http.client.protocol.HttpClientContext;
    

    and

    localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
    

    see http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/ClientContext.html

    and:

    http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/HttpClientContext.html

    0 讨论(0)
  • 2020-12-06 07:48

    If you like to use the HttpClient 4.x as mentioned in the other answers you could also use httpclientandroidlib. This is a converted stock HttpClient without apache.commons and with Android LogCat support.

    0 讨论(0)
提交回复
热议问题