2010-01-13 12 views
9

que estoy haciendo algo de autenticación HTTP simple y estoy recibiendo unJava: ir a buscar dirección URL con HTTPBasic autenticación

java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic OGU0ZTc5ODBk(...trimmed from 76 chars...) 
(...more password data...) 

que creo que se debe a que yo tenga una muy larga usuario y contraseña y el codificador lo envuelve con una \n a 76 caracteres ¿Hay alguna forma de evitar esto? La URL solo es compatible con HTTP Basic Auth.

Aquí está mi código:

private class UserPassAuthenticator extends Authenticator { 
    String user; 
    String pass; 
    public UserPassAuthenticator(String user, String pass) { 
     this.user = user; 
     this.pass = pass; 
    } 

    // This method is called when a password-protected URL is accessed 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, pass.toCharArray()); 
    } 
} 

private String fetch(StoreAccount account, String path) throws IOException { 
    Authenticator.setDefault(new UserPassAuthenticator(account.getCredentials().getLogin(), account.getCredentials().getPassword())); 

    URL url = new URL("https", account.getStoreUrl().replace("http://", ""), path); 
    System.out.println(url); 

    URLConnection urlConn = url.openConnection(); 
    Object o = urlConn.getContent(); 
    if (!(o instanceof String)) 
     throw new IOException("Wrong Content-Type on " + url.toString()); 

    // Remove the authenticator back to the default 
    Authenticator.setDefault(null); 
    return (String) o; 
} 
+0

Un aviso de seguridad: si el nombre de uso de usuario y contraseña a través de HTTP, tanto las cosas se envían como una cadena clara. Es mejor usar autenticación diferente (formulario, POST) y protocolo de transporte (HTTPS, H2). – tfb785

Respuesta

17

Eso parece ser un bug in Java.

¿Ha intentado utilizar clientes HTTP alternativos, como la biblioteca de Apache?

¿O en lugar de usar el Authenticator, configurar manualmente el encabezado?

URL url = new URL("http://www.example.com/"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("Authorization", "Basic OGU0ZTc5ODBkABcde...."); 

El valor del token es encodeBase64 ("nombre de usuario: contraseña").

+8

Funciona muy bien siempre y cuando haga la reparación de su publicación de error. \t \t 'Cadena de codificación = new sun.misc.BASE64Encoder(). Encode (userpass.getBytes()); \t \t // Java ERROR: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459815 \t \t encoding = encoding.replaceAll ("\ n", ""); '. Gracias –

+1

Aún me falla una contraseña de 64 caracteres cuando me autentico contra una API REST de Atlassian (como Bamboo). Reemplazar nuevas líneas no fue suficiente en mi caso. Groovy HTTPBuilder y AHC manejan correctamente la contraseña larga. –

+0

Gracias, Oracle, por desperdiciar 30 minutos de mi tiempo con esta idiotez. (Respuesta upvoted, gracias sinceras) – cbmanica

1

Esto funciona para mí.

HttpsURLConnection con = null; con = (HttpsURLConnection) obj.openConnection(); Codificación de cadena = Base64.getEncoder(). EncodeToString ("nombre de usuario: contraseña" .getBytes (StandardCharsets.UTF_8)); con.setRequestProperty ("Autorización", "Básico" + encoding.replaceAll ("\ n", ""));

0

me encontré con que el carácter ilegal fue causada por "Autorización: Básica", codificados que debe ser "Autorización", "Basic" + codificado

Cuestiones relacionadas