Служба, которую я вызывал (в данном случае Jira Cloud API от Atlassian), поддерживает как базовую, так и OAuth-аутентификацию. Я пытался использовать HTTP Basic, но он отправляет вызов аутентификации для OAuth.
Начиная с текущего JDK 11, HttpClient не отправляет базовые учетные данные, пока их не вызовут с заголовком WWW-Authenticate с сервера. Кроме того, единственный тип вызова, который он понимает, - это обычная проверка подлинности. Соответствующий код JDK находится здесь (в комплекте с TODO для поддержки не только базовой аутентификации), если вы хотите взглянуть.
Тем временем я решил обойти API аутентификации HttpClient, а также сам создать и отправить заголовок Basic Authorization:
public static void main(String[] args) {
var client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.build();
var request = HttpRequest.newBuilder()
.uri(new URI("https://service-that-needs-auth.example/"))
.header("Authorization", basicAuth("username", "password"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
}
private static String basicAuth(String username, String password) {
return "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes());
}