使用HttpUrlConnection进行抢占式基本身份验证?

问题描述 投票:35回答:6

使用HttpUrlConnection使用抢占式基本http身份验证的最佳方法是什么。 (现在假设我不能使用HttpClient)。

编辑澄清:我正在使用Base64编码在请求标头中正确设置un / pw。是否需要设置任何其他标志或属性,或者我是否为抢先式基本身份验证所需的所有请求设置基本身份验证头?

java android http authentication basic-authentication
6个回答
98
投票

如果您使用的是Java 8或更高版本,则可以使用java.util.Base64

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));  //Java 8
connection.setRequestProperty("Authorization", "Basic "+encoded);

然后正常使用连接。

如果您使用的是Java 7或更低版​​本,则需要一种方法将String编码为Base64,例如:

byte[] message = (username+":"+password).getBytes("UTF-8");
String encoded = javax.xml.bind.DatatypeConverter.printBase64Binary(message);

是的,这就是使用Basic Auth所需要做的一切。设置请求属性的上述代码应在打开连接后和获取输入或输出流之前立即完成。


2
投票

顺便说一句,如果你使用org.apache.commons.codec.binary.Base64并做Base64.encodeBase64String(),如果其他人遇到同样的问题,也会出现android问题。你需要做Base64.encodeBase64()并得到一个byte []然后构造字符串。

它完全让我感到不安,因为这两种方法之间的结束线的结果会有所不同。



1
投票

你需要做这个只是复制粘贴它很高兴

    HttpURLConnection urlConnection;
    String url;
 //   String data = json;
    String result = null;
    try {
        String username ="[email protected]";
        String password = "12345678";

        String auth =new String(username + ":" + password);
        byte[] data1 = auth.getBytes(UTF_8);
        String base64 = Base64.encodeToString(data1, Base64.NO_WRAP);
        //Connect
        urlConnection = (HttpURLConnection) ((new URL(urlBasePath).openConnection()));
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Authorization", "Basic "+base64);
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestMethod("POST");
        urlConnection.setConnectTimeout(10000);
        urlConnection.connect();
        JSONObject obj = new JSONObject();

        obj.put("MobileNumber", "+97333746934");
        obj.put("EmailAddress", "[email protected]");
        obj.put("FirstName", "Danish");
        obj.put("LastName", "Hussain");
        obj.put("Country", "BH");
        obj.put("Language", "EN");
        String data = obj.toString();
        //Write
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(data);
        writer.close();
        outputStream.close();
        int responseCode=urlConnection.getResponseCode();
        if (responseCode == HttpsURLConnection.HTTP_OK) {
            //Read
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

        String line = null;
        StringBuilder sb = new StringBuilder();

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);
        }

        bufferedReader.close();
        result = sb.toString();

        }else {
        //    return new String("false : "+responseCode);
        new String("false : "+responseCode);
        }

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

0
投票

我也有这个问题。现在我已经解决了这个问题。我的代码是:

    URL url = new URL(stringUrl);

    String authStr = "MyAPIKey"+":"+"Password";
    System.out.println("Original String is " + authStr);

 // encode data on your side using BASE64
    byte[] bytesEncoded = Base64.encodeBase64(authStr .getBytes());
    String authEncoded = new String(bytesEncoded);

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Authorization", "Basic "+authEncoded);

它可能会帮助许多其他人。祝你好运。


-2
投票

关于Base64编码问题,我找到了这个库:http://sourceforge.net/projects/migbase64/

我还没有完全审查它,但我将它用于上面显示的基本身份验证解决方案(以及图像编码/解码),并且它运行良好。它提供了是否包含换行符的参数。

© www.soinside.com 2019 - 2024. All rights reserved.