Вопрос

Я делаю простую аутентификацию HTTP и получаю

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

Что, я думаю, связано с тем, что у меня действительно длинное имя пользователя и пароль, а энкодер завершает его \n в 76 chars. Есть ли способ, которым я могу обойти это? URL поддерживает только HTTP Basic Auth.

Вот мой код:

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;
}
Это было полезно?

Решение

Это кажется Ошибка в Java.

Вы пробовали использовать альтернативные клиенты HTTP, таких как библиотека от Apache?

Или вместо использования аутентификатора вручную устанавливая заголовок?

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

Значением токена является encodebase64 («Имя пользователя: пароль»).

Другие советы

Это работает для меня.

Httpsurlconnection con = null; con = (httpsurlconnection) obj.openconcenection (); String encoding = base64.getencoder (). EncodeToString ("Имя пользователя: пароль" .getBytes (standardCharsets.utf_8)); con.setrequestproperty («авторизация», «базовый»+encoding.replaceall (" n", "" "));

Я обнаружил, что нелегальный характер был вызван «разрешением: базовым», закодированным, который должен быть «разрешение», «базовый» + кодированный

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top