137 votes

Connexion à une URL distante nécessitant une authentification à l'aide de Java

Comment puis-je me connecter à une URL distante en Java qui nécessite une authentification? J'essaie de trouver un moyen de modifier le code suivant pour pouvoir fournir par programme un nom d'utilisateur / mot de passe afin qu'il ne lance pas un 401.

 URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
 

144voto

Wanderson Santos Points 1387

Il existe une alternative native et moins intrusive, qui ne fonctionne que pour votre appel.

 URL url = new URL("location address");
URLConnection uc = url.openConnection();
String userpass = username + ":" + password;
String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes()));
uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();
 

141voto

James Van Huis Points 3333

Vous pouvez définir l'authentificateur par défaut pour les demandes http comme ceci:

 Authenticator.setDefault (new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("username", "password".toCharArray());
    }
});
 

De plus, si vous avez besoin de plus de flexibilité, vous pouvez consulter Apache HttpClient , qui vous donnera plus d'options d'authentification (ainsi que le support de session, etc.).

81voto

gloo Points 261

Vous pouvez également utiliser les éléments suivants, qui n'exigent pas l'utilisation de packages externes:

 URL url = new URL("location address");
URLConnection uc = url.openConnection();

String userpass = username + ":" + password;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();
 

46voto

javabeangrinder Points 1494

Si vous utilisez le login normal en entrant le nom d'utilisateur et le mot de passe entre le protocole et le domaine, c'est plus simple. Cela fonctionne aussi avec et sans connexion.

Exemple d'URL: http: // utilisateur: pass@domaine.com/url

 URL url = new URL("http://user:pass@domain.com/url");
URLConnection urlConnection = url.openConnection();

if (url.getUserInfo() != null) {
    String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
    urlConnection.setRequestProperty("Authorization", basicAuth);
}

InputStream inputStream = urlConnection.getInputStream();
 

4voto

lboix Points 88

Soyez très prudent avec l’approche "Base64 (). Encode ()", mon équipe et moi avons reçu 400 problèmes de requêtes d’Apache car ils ajoutaient un \ r \ n à la fin de la chaîne générée.

Nous l'avons trouvé en train de renifler des paquets grâce à Wireshark.

Voici notre solution:

 import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }
 

J'espère que ça aide!

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