web-dev-qa-db-fra.com

Comment gérer l'authentification HTTP à l'aide de HttpURLConnection?

J'écris un Java client qui POST sur un serveur HTTP qui nécessite l'authentification .
Je dois prendre en charge au moins les trois méthodes d'authentification suivantes: Basic, Digest ou Negotiate. De plus, le POST peut être très grand (plus de 2 Mo), donc je dois utiliser le streaming. Comme cela est documenté pour HttpURLConnection

Lorsque le streaming de sortie est activé, l'authentification et la redirection ne peuvent pas être gérées automatiquement. Une exception HttpRetryException sera levée lors de la lecture de la réponse si une authentification ou une redirection est requise.

Donc, je dois gérer l'authentification moi-même. J'ai cherché et cherché à nouveau un moyen d'utiliser les classes, déjà codées, mais je n'ai trouvé aucun moyen ...

Je pourrais simplement extraire les sources nécessaires de ici (car elles sont GPLv2 avec l'exception Classpath). Est-ce la bonne façon?

Merci.

33
Opher

Avez-vous besoin d'un streaming de sortie? HttpURLConnection supporte très certainement l'authentification avec la classe Authenticator, voir: Authentification Http .

Mise à jour: Dans le cas où le Authenticator n'est pas une option, vous pouvez effectuer manuellement l'authentification de base HTTP en ajoutant un en-tête supplémentaire à votre demande HTTP . Essayez le code suivant (non testé):

String userPassword = username + ":" + password;
String encoding = new Sun.misc.BASE64Encoder().encode(userPassword.getBytes());
URLConnection uc = url.openConnection();
uc.setRequestProperty("Authorization", "Basic " + encoding);
uc.connect();
49
Bruno De Fraine

Lié au commentaire de @Mat:

Voici un exemple utilisé par mon équipe et moi:

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!

4
lboix