Как сделать Preemptive аутентификацию с использованием Java 11 HTTP-клиента? - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь использовать Java 11 HTTP Client против аутентифицированной службы, используя обычную аутентификацию. Аутентификация проходит успешно, но она делает дополнительный обход к серверу, чтобы понять, что он должен отправить данные аутентификации.

Обыскали документацию и код и в какой-то момент внутренне использовали какой-то кеш, ноЯ не могу установить значение кэша.

Вот мой код клиента:

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://someurl.com"))
        .build();

HttpClient client = HttpClient.newBuilder()
        .authenticator(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("user", "pass".toCharArray());
            }
        })
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

Я ожидал, что каким-то образом я смогу сказать клиенту, что он превентивно отправляет данные аутентификации, а не толькокогда сервер запрашивает.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Благодаря @daniel, это решение, которое я придумал, добавив заголовок в HttpRequest и удалив Authenticator.

String encodedAuth = Base64.getEncoder()
        .encodeToString(("user" + ":" + "pass").getBytes(StandardCharsets.UTF_8));

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://someurl.com"))
        .header("Authorization", "Basic " + encodedAuth)
        .build();

HttpClient client = HttpClient.newHttpClient();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

Хотелось бы, чтобы у клиента был какой-то другой способ сказать, что нужно превентивно отправлять данные аутентификациивместо того, чтобы вручную создавать заголовок, но так он работает.

0 голосов
/ 29 октября 2019

HttpClient ведет себя так же, как и HttpURLConnection в том, что касается упреждающей аутентификации: для базовой аутентификации он упреждающе отправляет учетные данные, если находит их в своем кэше. Тем не менее, кэш заполняется после первого успешного запроса (или, точнее, после того, как заголовки ответа, указывающие, что аутентификация прошла успешно, анализируются).

Если для вас это неудовлетворительно, то существует возможность напрямую обработать аутентификацию. в вашем коде, вставив заголовок Authorization в ваш запрос и не устанавливая Authenticator.

...