diff --git a/sdk/src/main/java/io/dapr/client/DaprClientBuilder.java b/sdk/src/main/java/io/dapr/client/DaprClientBuilder.java index 8069fadd5..e8c9d889a 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClientBuilder.java +++ b/sdk/src/main/java/io/dapr/client/DaprClientBuilder.java @@ -5,6 +5,7 @@ package io.dapr.client; +import io.dapr.DaprClientGrpcInterceptor; import io.dapr.serializer.DaprObjectSerializer; import io.dapr.serializer.DefaultObjectSerializer; import io.dapr.utils.Constants; @@ -107,7 +108,10 @@ public class DaprClientBuilder { if (port <= 0) { throw new IllegalStateException("Invalid port."); } - ManagedChannel channel = ManagedChannelBuilder.forAddress(Constants.DEFAULT_HOSTNAME, port).usePlaintext().build(); + ManagedChannel channel = ManagedChannelBuilder.forAddress(Constants.DEFAULT_HOSTNAME, port) + .usePlaintext() + .intercept(new DaprClientGrpcInterceptor()) + .build(); Closeable closeableChannel = () -> { if (channel != null && !channel.isShutdown()) { channel.shutdown(); diff --git a/sdk/src/main/java/io/dapr/client/DaprClientGrpcInterceptor.java b/sdk/src/main/java/io/dapr/client/DaprClientGrpcInterceptor.java new file mode 100644 index 000000000..794857dc7 --- /dev/null +++ b/sdk/src/main/java/io/dapr/client/DaprClientGrpcInterceptor.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + */ + +package io.dapr; + +import io.dapr.utils.Constants; +import io.dapr.utils.Properties; +import io.grpc.CallOptions; +import io.grpc.Channel; +import io.grpc.ClientCall; +import io.grpc.ClientInterceptor; +import io.grpc.ForwardingClientCall; +import io.grpc.Metadata; +import io.grpc.Metadata.Key; +import io.grpc.MethodDescriptor; + +/** + * A dapr grpc client call interceptor. + */ +public class DaprClientGrpcInterceptor implements ClientInterceptor { + + /** + * {@inheritDoc} + */ + @Override + public ClientCall interceptCall(MethodDescriptor methodDescriptor, + CallOptions callOptions, Channel channel) { + return new ForwardingClientCall.SimpleForwardingClientCall(channel.newCall(methodDescriptor, + callOptions)) { + @Override + public void start(final Listener responseListener, final Metadata headers) { + String daprApiToken = Properties.getStringOrDefault(Constants.DAPR_API_TOKEN, + Constants.DAPR_API_TOKEN, null); + if (daprApiToken != null) { + headers.put(Key.of(Constants.DAPR_API_TOKEN_HEADER, Metadata.ASCII_STRING_MARSHALLER), daprApiToken); + } + super.start(responseListener, headers); + } + }; + } +} \ No newline at end of file diff --git a/sdk/src/main/java/io/dapr/client/DaprHttp.java b/sdk/src/main/java/io/dapr/client/DaprHttp.java index 73e33946c..c61bf2c3a 100644 --- a/sdk/src/main/java/io/dapr/client/DaprHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprHttp.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.dapr.exceptions.DaprError; import io.dapr.exceptions.DaprException; import io.dapr.utils.Constants; +import io.dapr.utils.Properties; import io.grpc.Context; import io.opentelemetry.OpenTelemetry; import io.opentelemetry.context.propagation.HttpTextFormat; @@ -258,6 +259,12 @@ public class DaprHttp implements Closeable { } else { requestBuilder.method(method, body); } + + String daprApiToken = Properties.getStringOrDefault(Constants.DAPR_API_TOKEN, Constants.DAPR_API_TOKEN, null); + if (daprApiToken != null) { + requestBuilder.addHeader(Constants.DAPR_API_TOKEN_HEADER, daprApiToken); + } + if (headers != null) { Optional.ofNullable(headers.entrySet()).orElse(Collections.emptySet()).stream() .forEach(header -> { @@ -308,4 +315,4 @@ public class DaprHttp implements Closeable { return EMPTY_BYTES; } -} +} \ No newline at end of file diff --git a/sdk/src/main/java/io/dapr/utils/Constants.java b/sdk/src/main/java/io/dapr/utils/Constants.java index 481463052..218fa9259 100644 --- a/sdk/src/main/java/io/dapr/utils/Constants.java +++ b/sdk/src/main/java/io/dapr/utils/Constants.java @@ -60,6 +60,16 @@ public final class Constants { */ public static final String ACTOR_TIMER_RELATIVE_URL_FORMAT = ACTORS_BASE_URL + "/%s/%s/timers/%s"; + /** + * Environment variable name for dapr api token. + */ + public static final String DAPR_API_TOKEN = "DAPR_API_TOKEN"; + + /** + * Header name for the dapr api token environment variable name. + */ + public static final String DAPR_API_TOKEN_HEADER = "dapr-api-token"; + /** * Base path to invoke methods. */