2010-01-13 10 views
9

robię pewne proste uwierzytelnianie HTTP i otrzymujęJava: pobrać URL z HTTPBasic Authentication

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

co moim zdaniem jest spowodowane mi o bardzo długiej nazwy użytkownika i hasła, a enkoder owija go z \n na 76 znaków. Czy jest jakiś sposób, żeby to obejść? Adres URL obsługuje tylko podstawowe uwierzytelnianie HTTP.

Oto mój kod:

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

Zawiadomienie bezpieczeństwa: jeśli nazwa wykorzystanie użytkownika i hasło za pośrednictwem protokołu HTTP, zarówno rzeczy są wysyłane jako czysty ciąg. Lepiej używać różnych uwierzytelnień (formularz, POST) i protokołu transportowego (HTTPS, H2). – tfb785

Odpowiedz

17

To wydaje się być bug in Java.

Czy próbowałeś używać alternatywnych klientów HTTP, takich jak biblioteka z Apache?

Lub zamiast używać Authenticator, ręczne ustawienie nagłówka?

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

Wartość tokena encodeBase64 ("nazwa użytkownika: hasło").

+8

Działa wspaniale tak długo, jak robię poprawkę z twojego wpisu błędu. \t 'Kodowanie stringów = nowy kodek sun.misc.BASE64Encoder(). (Userpass.getBytes()); \t \t // Java zgłoszenia: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459815 \t \t kodowania = encoding.replaceAll ("\ n", ""); '. Dzięki –

+1

Hasło 64-znakowe nadal nie działa w przypadku uwierzytelniania przeciwko Atlassian REST API (jak Bamboo). Zastępowanie nowych linii w moim przypadku było niewystarczające. Groovy HTTPBuilder i AHC poprawnie obsługują długie hasło. –

+0

Dzięki, Oracle, za zmarnowanie 30 minut mojego czasu z tym idiotyzmem. (Odpowiedź przegłosowana, serdeczne dzięki) – cbmanica

1

To działa dla mnie.

HttpsURLConnection con = null; con = (HttpsURLConnection) obj.openConnection(); String encoding = Base64.getEncoder(). EncodeToString ("nazwa użytkownika: hasło" .getBytes (StandardCharsets.UTF_8)); con.setRequestProperty ("Autoryzacja", "Basic" + encoding.replaceAll ("\ n", ""));

0

okazało się, że nielegalny charakter został spowodowany przez „Authorization: Basic”, zakodowane który powinien być „Autoryzacja”, „Basic” + zakodowany