2010-01-13 12 views
9

ich einige einfache HTTP-Authentifizierung mache und bin immer einJava: holen URL mit Httpbasic Authentication

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

die ich denke, ist auf mich einen wirklich langen Benutzernamen und Passwort mit und der Encoder wickelt es mit einem \n bei 76 Zeichen. Kann ich das irgendwie umgehen? Die URL unterstützt nur HTTP Basic Auth.

Hier ist mein Code:

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

Ein Sicherheitshinweis „Authorization“, „Basic“ + codiert sollte sein: wenn über HTTP Verwendung Benutzername und Passwort, die beide Dinge werden als klare Zeichenfolge gesendet. Es ist besser, verschiedene Authentifizierung (Formular, POST) und Transportprotokoll (HTTPS, H2) zu verwenden. – tfb785

Antwort

17

Das ist ein bug in Java zu sein scheint.

Haben Sie versucht, alternative HTTP-Clients zu verwenden, z. B. die Bibliothek von Apache?

Oder anstatt den Authenticator zu verwenden, den Header manuell einstellen?

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

Der Token-Wert ist encodeBase64 ("Benutzername: Passwort").

+8

Funktioniert gut, solange ich die Fehlerbehebung von Ihrem Bug-Post erledigen. \t \t 'String-Codierung = new sun.misc.BASE64Encoder(). Encode (userpass.getBytes()); \t \t // Java Bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459815 \t \t encoding = encoding.replaceAll ("\ n", ""); '. Thanks –

+1

Ein 64-Zeichen-Passwort schlägt immer noch für mich bei der Authentifizierung gegen eine Atlassian REST API (wie Bamboo). Das Ersetzen von Zeilenumbrüchen war in meinem Fall nicht ausreichend. Groovy HTTPBuilder und AHC behandeln das lange Passwort korrekt. –

+0

Danke, Oracle, für 30 Minuten meiner Zeit mit dieser Idiotie zu verschwenden. (Antwort hochgestimmt, herzlichen Dank) – cbmanica

1

Das funktioniert für mich.

HttpsURLConnection con = null; con = (HttpsURLConnection) obj.openConnection(); Zeichenfolge encoding = Base64.getEncoder(). EncodeToString ("Benutzername: Kennwort" .getBytes (StandardCharsets.UTF_8)); con.setRequestProperty ("Authorization", "Basic" + encoding.replaceAll ("\ n", ""));

0

fand ich, dass der illegale Charakter von „Authorization: Basic“ verursacht wurde, codierte die