42 votes

Apache HttpClient (4.1 et plus récent) : comment effectuer une authentification de base ?

Comment puis-je ajouter une authentification de base pour le client par défaut de la bibliothèque httpClient ? J'ai vu des exemples où ils utilisent client.getCredentialProvider(), cependant je crois que toutes ces méthodes sont pour la version 4.0.1 ou 3.x de la bibliothèque. Y a-t-il un nouvel exemple de comment faire cela ? Merci beaucoup.

84voto

Joe Points 136
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials("nom d'utilisateur", "mot de passe"));
CloseableHttpClient httpClient = 
    HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();

20voto

Rusty Points 415

N'avez-vous pas téléchargé l'exemple du site web ? Les exemples se trouvent ici : httpcomponents-client-4.1.3\examples\org\apache\http\examples\client

En ce qui concerne https, il suffit de consulter ClientAuthentication.java :

/*
 * ====================================================================
 *
 *  Conformément à une ou plusieurs ententes de licence de l'Apache Software Foundation (ASF),
 *  consultez le fichier NOTICE distribué avec le présent travail pour plus d'informations sur la propriété des droits d'auteur.
 *  L'ASF accorde à vous une licence sous la forme de l'Apache License, Version 2.0
 *  (la "Licence") ; vous ne pouvez utiliser ce fichier qu'en conformité avec la Licence. 
 *  Vous pouvez obtenir une copie de la Licence à l'adresse
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * À moins qu'une exigence légale applicable ou un accord à l'écrit ne le nécessite, le logiciel
 * distribué selon la Licence est distribué sur une base "TEL QUEL",
 * SANS GARANTIES OU CONDITIONS D'AUCUNE SORTE, expresses ou implicites.
 * Voir la Licence pour le langage spécifique régissant les autorisations et
 * les limitations en vertu de la Licence.
 * ====================================================================
 *
 * Ce logiciel est constitué de contributions volontaires faites par de nombreux
 * individus pour le compte de l'Apache Software Foundation.
 * Pour plus d'informations sur l'Apache Software Foundation, veuillez consulter
 * .
 */

package org.apache.http.examples.client;

import org.apache.http.HttpEntity;
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;

/**
 * Un exemple simple qui utilise HttpClient pour exécuter une requête HTTP contre
 * un site cible nécessitant une authentification utilisateur.
 */
public class ClientAuthentication {

    public static void main(String[] args) throws Exception {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        try {
            httpclient.getCredentialsProvider().setCredentials(
                    new AuthScope("localhost", 443),
                    new UsernamePasswordCredentials("username", "password"));

            HttpGet httpget = new HttpGet("https://localhost/protected");

            System.out.println("exécution de la requête" + httpget.getRequestLine());
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Longueur du contenu de la réponse : " + entity.getContentLength());
            }
            EntityUtils.consume(entity);
        } finally {
            // Lorsque l'instance de HttpClient n'est plus nécessaire,
            // arrêtez le gestionnaire de connexion pour assurer
            // la libération immédiate de toutes les ressources du système
            httpclient.getConnectionManager().shutdown();
        }
    }
}

En résumé :

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
                    new AuthScope("localhost", 443),
                    new UsernamePasswordCredentials("username", "password"));

10voto

Barett Points 876

Une autre option moderne pour 4.3 est d'utiliser l'extension Fluent:

Executor executor = Executor.newInstance()
        .auth(new HttpHost("somehost"), "username", "password")
        .auth(new HttpHost("securehost", 443, "https"), "username", "password") // exemple https
        .auth(new HttpHost("myproxy", 8080), "username", "password")
        .authPreemptive(new HttpHost("myproxy", 8080));

String content = executor.execute(Request.Get("http://somehost/"))
        .returnContent().asString();

4voto

stefan Points 51

DefaultHttpClient a getCredentialsProvider() mais HttpClient n'a pas. Vous devez déclarer DefaultHttpClient client = ... au lieu de HttpClient client = ...

0voto

Amit Singh Points 31

J'avais cette exigence d'invocation d'une URL avec une authentification de base qui nécessitait également des paramètres de proxy. C'est ce qui a fonctionné pour moi.

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.StringReader;
    import java.util.HashMap;
    import java.util.Map;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;

    import org.apache.commons.httpclient.Credentials;
    import org.apache.commons.httpclient.HostConfiguration;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpMethod;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.UsernamePasswordCredentials;
    import org.apache.commons.httpclient.auth.AuthScope;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.w3c.dom.*;

    import javax.xml.parsers.*;

    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;

    public class TestResponse {

    public final static String TESTURL="https://myURL";
    private static final String PROXY_HOST = "www2.proxyXYS";
    private static final int PROXY_PORT = 8080;

    public static void main (String args[]) 
    {
    HttpClient client = new HttpClient();
    HttpMethod method = new GetMethod(TESTURL);
    HostConfiguration config = client.getHostConfiguration();
    config.setProxy(PROXY_HOST, PROXY_PORT);

      String username = "User";
      String password = "Pa55w0rd";

    Credentials credentials = new UsernamePasswordCredentials(username, password);
    AuthScope authScope = new AuthScope(PROXY_HOST, PROXY_PORT);

    client.getState().setProxyCredentials(authScope, credentials);
    client.getState().setCredentials(AuthScope.ANY, credentials);

    try {
        client.executeMethod(method);

        String response = method.getResponseBodyAsString();

        if (method.getStatusCode() == HttpStatus.SC_OK) {
             response = method.getResponseBodyAsString();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        method.releaseConnection();
    }
}

}

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