web-dev-qa-db-fra.com

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 puisse pas utiliser HttpClient).

EDIT pour clarification: je configure correctement le un/pw dans l'en-tête de la demande en utilisant le codage 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 tout ce qui est nécessaire pour l'authentification de base préemptive?

41
Dave Sims

Si vous utilisez Java 8 ou 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);


Utilisez ensuite la connexion normalement.

Si vous utilisez Java 7 ou inférieur, vous aurez besoin d'une méthode pour coder 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 effectué immédiatement après l'ouverture de la connexion et avant d'obtenir les flux d'entrée ou de sortie.

109
dontocsata

Par ailleurs, dans le cas où quelqu'un d'autre rencontre le mê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 obtenez un octet [] puis construisez la chaîne.

Cela m'a complètement surpris que les résultats soient différents pour la ligne se terminant entre ces deux méthodes.

3
dawson

Vous pouvez utiliser Java.net.Authenticator pour configurer l'authentification de base. globalement pour chaque demande envoyée par votre application, voir:

2
avianey

vous devez le faire simplement copier-coller, soyez heureux

    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();
    }
2

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 en aider beaucoup d'autres. Bonne chance.

1
Khawaja M. Awais