43 votes

Authentification de base préemptive avec HttpUrlConnection ?

Quelle est la meilleure façon d'utiliser l'authentification http de base préemptive à l'aide de HttpUrlConnection. (Supposons pour l'instant que je ne peux pas utiliser HttpClient).

EDIT pour clarification : je définis correctement le un/pw dans l'en-tête de la demande à l'aide de l'encodage Base64. Y a-t-il des indicateurs ou des propriétés supplémentaires qui doivent être définis, ou le fait que je définisse les en-têtes d'authentification de base pour la demande est-il suffisant pour l'authentification de base préemptive ?

118voto

dontocsata Points 922

Si vous utilisez Java 8 ou une version ultérieure, java.util.Base64 est utilisable :

 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);

Ensuite, utilisez la connexion normalement.

Si vous utilisez Java 7 ou une version antérieure, vous aurez besoin d'une méthode pour encoder une chaîne en Base64, telle que :

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

Oui, c'est tout ce que vous avez à faire pour utiliser Basic Auth. Le code ci-dessus pour définir la propriété de demande doit être exécuté immédiatement après l'ouverture de la connexion et avant d'obtenir les flux d'entrée ou de sortie.

3voto

dawson Points 43

Incidemment, au cas où quelqu'un d'autre rencontre le même problème, le problème Android est également présent si vous utilisez org.apache.commons.codec.binary.Base64 et faites Base64.encodeBase64String() . Vous devez faire Base64.encodeBase64() et obtenir un octet[] puis construire la chaîne.

Cela m'a complètement pris au dépourvu que les résultats seraient différents pour la ligne se terminant entre ces deux méthodes.

3voto

vous devez le faire juste un copier-coller, soyez heureux

     HttpURLConnection urlConnection;
    String url;
 //   String data = json;
    String result = null;
    try {
        String username ="danish.hussain@gmail.com";
        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", "danish.hussain@dhl.com");
        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();
    }

1voto

Khawaja M. Awais Points 183

J'avais aussi ce problème. Et maintenant j'ai résolu ce problème. Mon code est :

     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);

Cela peut aider beaucoup d'autres. Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X