Skip to content

Commit 9853819

Browse files
authored
Merge pull request #50981 from staillebois/elasticsearch/apikey
Add apiKey to configuration for elasticsearch rest client extension
2 parents 3090ac4 + f7d52d0 commit 9853819

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

extensions/elasticsearch-rest-client/runtime/src/main/java/io/quarkus/elasticsearch/restclient/lowlevel/runtime/ElasticsearchConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public interface ElasticsearchConfig {
3838
*/
3939
Optional<String> password();
4040

41+
/**
42+
* The API key for authentication.
43+
*/
44+
Optional<String> apiKey();
45+
4146
/**
4247
* The connection timeout.
4348
*/

extensions/elasticsearch-rest-client/runtime/src/main/java/io/quarkus/elasticsearch/restclient/lowlevel/runtime/RestClientBuilderHelper.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import java.net.InetSocketAddress;
44
import java.util.ArrayList;
5+
import java.util.Collections;
56
import java.util.List;
67

8+
import org.apache.http.Header;
9+
import org.apache.http.HttpHeaders;
710
import org.apache.http.HttpHost;
811
import org.apache.http.auth.AuthScope;
912
import org.apache.http.auth.UsernamePasswordCredentials;
@@ -12,6 +15,7 @@
1215
import org.apache.http.impl.client.BasicCredentialsProvider;
1316
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
1417
import org.apache.http.impl.nio.reactor.IOReactorConfig;
18+
import org.apache.http.message.BasicHeader;
1519
import org.apache.http.nio.conn.NoopIOSessionStrategy;
1620
import org.elasticsearch.client.RestClient;
1721
import org.elasticsearch.client.RestClientBuilder;
@@ -24,6 +28,7 @@
2428
import io.quarkus.arc.Arc;
2529
import io.quarkus.arc.InstanceHandle;
2630
import io.quarkus.elasticsearch.restclient.lowlevel.ElasticsearchClientConfig;
31+
import io.quarkus.runtime.configuration.ConfigurationException;
2732

2833
public final class RestClientBuilderHelper {
2934

@@ -54,16 +59,7 @@ public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder reques
5459
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
5560
@Override
5661
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
57-
if (config.username().isPresent()) {
58-
if (!"https".equalsIgnoreCase(config.protocol())) {
59-
LOG.warn("Using Basic authentication in HTTP implies sending plain text passwords over the wire, " +
60-
"use the HTTPS protocol instead.");
61-
}
62-
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
63-
credentialsProvider.setCredentials(AuthScope.ANY,
64-
new UsernamePasswordCredentials(config.username().get(), config.password().orElse(null)));
65-
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
66-
}
62+
applyAuthentication(httpClientBuilder, config);
6763

6864
if (config.ioThreadCounts().isPresent()) {
6965
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
@@ -112,4 +108,28 @@ public static Sniffer createSniffer(RestClient client, ElasticsearchConfig confi
112108

113109
return builder.build();
114110
}
111+
112+
private static void applyAuthentication(HttpAsyncClientBuilder httpClientBuilder, ElasticsearchConfig config) {
113+
boolean hasBasic = config.username().isPresent();
114+
boolean hasApiKey = config.apiKey().isPresent();
115+
if (hasBasic && hasApiKey) {
116+
throw new ConfigurationException("You must provide either a valid username/password pair for Basic " +
117+
"authentication OR only a valid API key for ApiKey authentication. Both methods are currently " +
118+
"enabled.");
119+
}
120+
if (!"https".equalsIgnoreCase(config.protocol()) && (hasBasic || hasApiKey)) {
121+
LOG.warn("Transmitting authentication information over HTTP is unsafe as it implies sending sensitive " +
122+
"information as plain text over an unencrypted channel. Use the HTTPS protocol instead.");
123+
}
124+
if (hasBasic) {
125+
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
126+
credentialsProvider.setCredentials(AuthScope.ANY,
127+
new UsernamePasswordCredentials(config.username().get(), config.password().orElse(null)));
128+
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
129+
} else if (hasApiKey) {
130+
String apiKey = config.apiKey().get();
131+
Header apiKeyHeader = new BasicHeader(HttpHeaders.AUTHORIZATION, "ApiKey " + apiKey);
132+
httpClientBuilder.setDefaultHeaders(Collections.singleton(apiKeyHeader));
133+
}
134+
}
115135
}

0 commit comments

Comments
 (0)