Pergunta

Estou fazendo uma autenticação HTTP simples e estou recebendo um

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

O que eu acho que é devido a eu ter um nome de usuário e senha muito longos e o codificador o envolve com um \n em 76 chars. Existe alguma maneira de contornar isso? O URL suporta apenas o HTTP Basic Auth.

Aqui está o meu 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;
}
Foi útil?

Solução

Isso parece ser um Bug em java.

Você já tentou usar clientes HTTP alternativos, como a biblioteca do Apache?

Ou, em vez de usar o autenticador, definindo manualmente o cabeçalho?

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

O valor do token é EncodeBase64 ("Nome de usuário: senha").

Outras dicas

Isso funciona para mim.

HttpsurlConnection con = null; con = (httpsurlConnection) obj.openconnection (); String coding = base64.getEncoder (). CodetoString ("nome de usuário: senha" .getBytes (padrãocharsets.utf_8)); Con.SetRequestProperty ("Autorização", "Basic"+Encoding.Replaceall (" n", ""));

Descobri que o caráter ilegal foi causado por "autorização: básico", codificado que deveria ser "autorização", "básico" + codificado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top