Подключение к удаленному URL-адресу, для которого требуется аутентификация с использованием Java

Как подключиться к удаленному URL-адресу в Java, для которого требуется аутентификация. Я пытаюсь найти способ изменить следующий код, чтобы иметь возможность программно предоставить имя пользователя/пароль, чтобы он не выбрал 401.

URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

Ответ 1

Вы можете установить аутентификатор по умолчанию для HTTP-запросов следующим образом:

Authenticator.setDefault (new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("username", "password".toCharArray());
    }
});

Кроме того, если вам требуется большая гибкость, вы можете проверить Apache HttpClient, что даст вам дополнительные параметры проверки подлинности (а также сеанс поддержка и т.д.)

Ответ 2

Там есть нативная и менее интрузивная альтернатива, которая работает только для вашего вызова.

URL url = new URL("location address");
URLConnection uc = url.openConnection();
String userpass = username + ":" + password;
String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes()));
uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();

Ответ 3

Вы также можете использовать следующее, которое не требует использования внешних пакетов:

URL url = new URL("location address");
URLConnection uc = url.openConnection();

String userpass = username + ":" + password;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();

Ответ 4

Если вы используете обычный логин, введя имя пользователя и пароль между протоколом и доменом, это проще. Он также работает и без входа.

Пример URL: http://user:[email protected]/url

URL url = new URL("http://user:[email protected]/url");
URLConnection urlConnection = url.openConnection();

if (url.getUserInfo() != null) {
    String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
    urlConnection.setRequestProperty("Authorization", basicAuth);
}

InputStream inputStream = urlConnection.getInputStream();

Ответ 5

Как я пришел сюда в поисках Android-Java-ответа, я собираюсь сделать краткое резюме:

  • Использовать java.net.Authenticator, как показано James van Huis
  • Использовать HTTP-клиент Apache Commons, как в этом ответе
  • Используйте базовое java.net.URLConnection и установите заголовок аутентификации вручную, как показано здесь

Если вы хотите использовать java.net.URLConnection с базовой аутентификацией в Android, попробуйте этот код:

URL url = new URL("http://www.mywebsite.com/resource");
URLConnection urlConnection = url.openConnection();
String header = "Basic " + new String(android.util.Base64.encode("user:pass".getBytes(), android.util.Base64.NO_WRAP));
urlConnection.addRequestProperty("Authorization", header);
// go on setting more request headers, reading the response, etc

Ответ 6

Будьте осторожны с подходом "Base64(). encode()", моя команда и я получили 400 проблем с неправильным запросом Apache, потому что он добавляет \r\n в конце сгенерированной строки.

Мы обнаружили, что он обнюхивает пакеты благодаря Wireshark.

Вот наше решение:

import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

Надеюсь, что это поможет!

Ответ 7

Используйте этот код для базовой проверки подлинности.

URL url = new URL(path);
String userPass = "username:password";
String basicAuth = "Basic " + Base64.encodeToString(userPass.getBytes(), Base64.DEFAULT);//or
//String basicAuth = "Basic " + new String(Base64.encode(userPass.getBytes(), Base64.No_WRAP));
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("Authorization", basicAuth);
urlConnection.connect();

Ответ 8

ANDROD ОСУЩЕСТВЛЕНИЕ Полный метод запроса данных/строкового ответа от веб-службы, запрашивающей авторизацию с именем пользователя и паролем

public static String getData(String uri, String userName, String userPassword) {
        BufferedReader reader = null;
        byte[] loginBytes = (userName + ":" + userPassword).getBytes();

        StringBuilder loginBuilder = new StringBuilder()
                .append("Basic ")
                .append(Base64.encodeToString(loginBytes, Base64.DEFAULT));

        try {
            URL url = new URL(uri);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.addRequestProperty("Authorization", loginBuilder.toString());

            StringBuilder sb = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine())!= null){
                sb.append(line);
                sb.append("\n");
            }

            return  sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (null != reader){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }