Войдите с HTTPS в защищенный каталог htaccess - PullRequest
0 голосов
/ 07 октября 2010

приложение, которое я сейчас создаю, должно выполнить вход с именем пользователя и паролем. Я использую DefaultHttpClient для выполнения запроса и установки имени пользователя и пароля в качестве учетных данных. сервер ожидает htacces-login. Результат, который я получаю, не является логином, на который я надеялся. Вместо этого он возвращает сообщение об ошибке. Кто-нибудь может сказать мне, где я ошибся в своем кодексе? Спасибо большое за вашу помощь! пр

private String httpLoginRequest() {
    String loginToken = null;
    String loginUrl = "https://somedomain.com/login";

    DefaultHttpClient client = new DefaultHttpClient();
    client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials("username", "password"));
    HttpResponse httpResponse;
    HttpEntity entity;
    try{
        httpResponse = client.execute(request);
        entity = httpResponse.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            loginToken = convertInputStreamToString(instream);
        }
    } catch (ClientProtocolException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
    return loginToken;
}

Спасибо вам, ребята, за вашу помощь. Я наконец-то понял. Это была смесь разных вещей: 1. то, что вы не можете увидеть в коде выше (потому что я удалил его случайно), это то, что запрос является пост. наш API ожидает запрос на получение, хотя мне сказали иначе 2. Я поставил учетные данные не в том месте. они должны быть установлены в HttpGet-Object как в Exampe, заданном CommonsWare 3. Мне действительно нужно кодировать учетные данные с помощью base64, упомянутого вами

вот код, который наконец-то сработал для меня:

public String httpLoginRequest() {
    String loginToken = null;
    String loginUrl = "https://somedomain.com/login";
    //
    DefaultHttpClient client = new DefaultHttpClient();
    HttpResponse httpResponse;
    HttpEntity entity;
    HttpGet request = new HttpGet(loginUrl);
    request.addHeader("Authorization", "Basic " + Base64.encodeCredentials("username", "password"));
    try{
        httpResponse = client.execute(request);
        entity = httpResponse.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            loginToken = convertInputStreamToString(instream);
            Log.d(LOG_TAG, "Login Token: " + loginToken);
        }
    } catch (ClientProtocolException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
    return loginToken;
}

Когда я найду время, я попробую пример, приведенный в ответе, так как я больше похож на то, что мне понадобится для некоторых других запросов в моем проекте.

1 Ответ

0 голосов
/ 08 октября 2010

Насколько я знаю, вам нужно переписать HostnameVerifier, чтобы всегда возвращать true:

public class MyHostnameVerifier implements HostnameVerifier {
    @Override
    public boolean verify(String hostname, SSLSession session) {
    return true;
    }
}

Я использую метод HttpsURLConnection. Поэтому вам нужно создать свой собственный класс Base64 для шифрования аутентификации и свой собственный менеджер доверия

//kObjects 
//
// Copyright (C) 2001 Stefan Haustein, Oberhausen (Rhld.), Germany
//
// Contributors: 
//
// License: LGPL
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA

import java.io.*;

/*
 * You can now use also javax.mail.internet.MimeUtility
 * and sun.misc.BASE64Encoder.encode.
 * There is a non-public class in Java 1.4+ called java.util.prefs.Base64
 */
public class MyBase64 {

    static final char[] charTab = 
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray (); 


    public static String encode (byte [] data) {
        return encode (data, 0, data.length, null).toString ();
    }


    /** Encodes the part of the given byte array denoted by start and
        len to the Base64 format.  The encoded data is appended to the
        given StringBuffer. If no StringBuffer is given, a new one is
        created automatically. The StringBuffer is the return value of
        this method. */


    public static StringBuffer encode (byte [] data, int start, int len, StringBuffer buf) {

        if (buf == null) 
            buf = new StringBuffer (data.length * 3 / 2);

        int end = len - 3;
        int i = start;
        int n = 0;

        while (i <= end) {
            int d = (((data [i]) & 0x0ff) << 16) 
                | (((data [i+1]) & 0x0ff) << 8)
                | ((data [i+2]) & 0x0ff);

            buf.append (charTab [(d >> 18) & 63]);
            buf.append (charTab [(d >> 12) & 63]);
            buf.append (charTab [(d >> 6) & 63]);
            buf.append (charTab [d & 63]);

            i += 3;

            if (n++ >= 14) {
                n = 0;
                buf.append ("\r\n");
            }
        }


        if (i == start + len - 2) {
            int d = (((data [i]) & 0x0ff) << 16) 
                | (((data [i+1]) & 255) << 8);

            buf.append (charTab [(d >> 18) & 63]);
            buf.append (charTab [(d >> 12) & 63]);
            buf.append (charTab [(d >> 6) & 63]);
            buf.append ("=");
        }
        else if (i == start + len - 1) {
            int d = ((data [i]) & 0x0ff) << 16;

            buf.append (charTab [(d >> 18) & 63]);
            buf.append (charTab [(d >> 12) & 63]);
            buf.append ("==");
        }

        return buf;
    }


    static int decode (char c) {
        if (c >= 'A' && c <= 'Z') 
            return c - 65;
        else if (c >= 'a' && c <= 'z') 
            return c - 97 + 26;
        else if (c >= '0' && c <= '9')
            return c - 48 + 26 + 26;
        else switch (c) {
        case '+': return 62;
        case '/': return 63;
        case '=': return 0;
        default:
            throw new RuntimeException (new StringBuffer("unexpected code: ").append(c).toString());
        }
    }


    /** Decodes the given Base64 encoded String to a new byte array. 
        The byte array holding the decoded data is returned. */


    public static byte [] decode (String s) {

        int i = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream ();
        int len = s.length ();

        while (true) { 
            while (i < len && s.charAt (i) <= ' ') i++;

            if (i == len) break;

            int tri = (decode (s.charAt (i)) << 18)
                + (decode (s.charAt (i+1)) << 12)
                + (decode (s.charAt (i+2)) << 6)
                + (decode (s.charAt (i+3)));

            bos.write ((tri >> 16) & 255);
            if (s.charAt (i+2) == '=') break;
            bos.write ((tri >> 8) & 255);
            if (s.charAt (i+3) == '=') break;
            bos.write (tri & 255);

            i += 4;
        }
        return bos.toByteArray ();
    }

   /**
    * java org.xmlBlaster.util.Base64 HelloWorld
    * java org.xmlBlaster.util.Base64 -decode Q2lBOGEyVjVJRzlwWkQwblNHVnNiRzhuSUdOdmJuUmxiblJOYVcxbFBTZDBaWGgwTDNodGJDY2dZMjl1ZEdWdWRFMXBiV1ZGZUhSbGJtUmxaRDBuTVM0d0p6NEtJQ0E4YjNKbkxuaHRiRUpzWVhOMFpYSStQR1JsYlc4dE16NDhMMlJsYlc4dE16NDhMMjl5Wnk1NGJXeENiR0Z6ZEdWeVBnb2dQQzlyWlhrKw==
    */
   public static void main(String[] args) {
      if (args.length == 2) {
         if (args[0].equals("-decode")) {
            String base64 = args[1];
            byte[] back = MyBase64.decode(base64);
            System.out.println("Decoded to '" + new String(back) + "'");
            return;
         }
      }
      {
         String hello = args.length > 0 ? args[0] : "Hello World";
         String base64 = MyBase64.encode(hello.getBytes());
         byte[] back = MyBase64.decode(base64);
         System.out.println("Before Base64 '" + hello + "' base64='" + (new String(base64)) + "' after '" + new String(back) + "'");
      }
   }
}

и

public class MyTrustManager implements X509TrustManager {

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

После этого вы должны быть готовы пойти:

/*
 * Return the string from a authenticated SSL secured webserver call
 * */
public String sendHTTPSPostMessage(String userName, String userPass, String url, String[] postVars) throws NoSuchAlgorithmException, KeyManagementException, MalformedURLException, IOException {
    StringBuffer sb = new StringBuffer();

    final String serverAuth = userName + ":" + userPass;
    final String serverAuthBase64 = MyBase64.encode(serverAuth.getBytes());

    SSLContext sc = SSLContext.getInstance("TLS");
    sc.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
    HttpsURLConnection con = (HttpsURLConnection) new URL(url).openConnection();

    try {
        StringBuffer urlParameters = new StringBuffer();
        String[] tmpPair = null;

        for (int i = 0; i < postVars.length; i++) {
            tmpPair = postVars[i].toString().split("=");

            if (i > 0)
                urlParameters.append("&" + tmpPair[0] + "=" + URLEncoder.encode(tmpPair[1], "UTF-8"));
            else
                urlParameters.append(tmpPair[0] + "=" + URLEncoder.encode(tmpPair[1], "UTF-8"));
        }

        con.setRequestMethod("POST");
        con.setRequestProperty("Authorization", "Basic " + serverAuthBase64);
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        con.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.toString().getBytes().length));
        con.setUseCaches(false);
        con.setDoOutput(true);
        con.setDoInput(true);

        DataOutputStream wr = new DataOutputStream (con.getOutputStream());
        wr.writeBytes (urlParameters.toString());
        wr.flush();
        wr.close();

        BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()), 8192 );
        String line;
        while ( ( line = br.readLine() ) != null ) {
                sb.append(line);
        }
    }
    catch(Exception e) {
        Log.e("sendHTTPSPostMessage", e.getLocalizedMessage());
    }
    finally {
        if(con != null) {
            con.disconnect(); 
        }
    }
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...