2011-02-03 18 views
32

Estoy escribiendo un cliente de Java que POST a un servidor HTTP que requiere autenticación .
Tengo que admitir al menos los siguientes tres métodos de autenticación: Basic, Digest o Negotiate. Además, el POST puede ser muy grande (más de 2 MB), así que necesito usar la transmisión. Como se documenta para HttpURLConnection¿Cómo manejar la autenticación HTTP usando HttpURLConnection?

When output streaming is enabled, authentication and redirection cannot be handled automatically. A HttpRetryException will be thrown when reading the response if authentication or redirection are required.

Por lo tanto, tengo que manejar la autenticación a mí mismo. Busqué y busqué nuevamente una forma de emplear las clases ya codificadas, pero no encontré ninguna manera ...

Podría arrancar las fuentes necesarias de here (ya que son GPLv2 con excepción de Classpath). ¿Es este el camino correcto?

Gracias.

+0

¿qué tipo de autenticación? HTTP BASIC Auth? ¿O algo más complejo? – Tim

+0

Ya sea _Basic_, _Digest_ o _Negotiate_. Básico es ** fácil **. Los otros dos no son :) – Opher

Respuesta

47

¿Necesita transmisión de salida? El HttpURLConnection definitivamente admite autenticación con la clase Authenticator, consulte: Http Authentication.

Actualización: En caso de que Authenticator no sea una opción, puede realizar manualmente una autenticación HTTP básica agregando un encabezado adicional a su solicitud HTTP. Pruebe el siguiente código (no probado):

String userPassword = username + ":" + password; 
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes()); 
URLConnection uc = url.openConnection(); 
uc.setRequestProperty("Authorization", "Basic " + encoding); 
uc.connect(); 
+0

Sí. Mi ** POST ** incluye un archivo que puede tener más de 2 MB de tamaño. – Opher

+0

@Opher: Actualicé mi respuesta con otra solución –

+0

Gracias. Actualicé mi pregunta para aclarar que necesito manejar la autenticación Básica, Digest o Negociar. Lo que realmente necesito ayuda es _Negotiate_ – Opher

4

Relacionado con el comentario de @ Mat:

Aquí es un ejemplo utilizado por mi equipo y yo:

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

espero que ayude!

+0

Mi Eclipse no encontró el paquete de códec, pero puede descargarlo directamente desde http://commons.apache.org/proper/commons-codec/download_codec.cgi y agregar el jar como referencia. – Tyron

Cuestiones relacionadas