diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/ClientPropertiesDaprConnectionDetails.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/ClientPropertiesDaprConnectionDetails.java index 68b4c41217..3ff173108b 100644 --- a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/ClientPropertiesDaprConnectionDetails.java +++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/ClientPropertiesDaprConnectionDetails.java @@ -40,4 +40,10 @@ public Integer getHttpPort() { public Integer getGrpcPort() { return this.daprClientProperties.getGrpcPort(); } + + @Override + public String getApiToken() { + return this.daprClientProperties.getApiToken(); + } + } diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfiguration.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfiguration.java index 23be58b85c..941ae6ff22 100644 --- a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfiguration.java +++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfiguration.java @@ -68,6 +68,11 @@ DaprClientBuilder daprClientBuilder(DaprConnectionDetails daprConnectionDetails) builder.withPropertyOverride(Properties.GRPC_PORT, String.valueOf(grpcPort)); } + String apiToken = daprConnectionDetails.getApiToken(); + if (apiToken != null) { + builder.withPropertyOverride(Properties.API_TOKEN, apiToken); + } + return builder; } @@ -145,6 +150,11 @@ protected Properties createPropertiesFromConnectionDetails(DaprConnectionDetails propertyOverrides.put(Properties.GRPC_PORT.getName(), String.valueOf(grpcPort)); } + String apiToken = daprConnectionDetails.getApiToken(); + if (apiToken != null) { + propertyOverrides.put(Properties.API_TOKEN.getName(), apiToken); + } + return new Properties(propertyOverrides); } diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientProperties.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientProperties.java index 6fb67d5638..ac3971579e 100644 --- a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientProperties.java +++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprClientProperties.java @@ -13,7 +13,6 @@ package io.dapr.spring.boot.autoconfigure.client; -import io.dapr.spring.data.DaprKeyValueAdapterResolver; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "dapr.client") @@ -22,6 +21,7 @@ public class DaprClientProperties { private String grpcEndpoint; private Integer httpPort; private Integer grpcPort; + private String apiToken; /** * Constructs a {@link DaprClientProperties}. @@ -35,12 +35,15 @@ public DaprClientProperties() { * @param grpcEndpoint grpc endpoint to interact with the Dapr Sidecar * @param httpPort http port to interact with the Dapr Sidecar * @param grpcPort grpc port to interact with the Dapr Sidecar + * @param apiToken dapr API token to interact with the Dapr Sidecar */ - public DaprClientProperties(String httpEndpoint, String grpcEndpoint, Integer httpPort, Integer grpcPort) { + public DaprClientProperties(String httpEndpoint, String grpcEndpoint, Integer httpPort, Integer grpcPort, + String apiToken) { this.httpEndpoint = httpEndpoint; this.grpcEndpoint = grpcEndpoint; this.httpPort = httpPort; this.grpcPort = grpcPort; + this.apiToken = apiToken; } public String getHttpEndpoint() { @@ -74,4 +77,12 @@ public void setHttpPort(Integer httpPort) { public void setGrpcPort(Integer grpcPort) { this.grpcPort = grpcPort; } + + public String getApiToken() { + return apiToken; + } + + public void setApiToken(String apiToken) { + this.apiToken = apiToken; + } } diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprConnectionDetails.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprConnectionDetails.java index 76e9d7166a..b45dcd21eb 100644 --- a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprConnectionDetails.java +++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprConnectionDetails.java @@ -25,4 +25,6 @@ public interface DaprConnectionDetails extends ConnectionDetails { Integer getGrpcPort(); + String getApiToken(); + } diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientPropertiesTest.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientPropertiesTest.java index 85bd605a7b..7a1781d132 100644 --- a/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientPropertiesTest.java +++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientPropertiesTest.java @@ -31,7 +31,7 @@ public class DaprClientPropertiesTest { public void shouldCreateDaprClientPropertiesCorrectly() { DaprClientProperties properties = new DaprClientProperties( - "http://localhost", "localhost", 3500, 50001 + "http://localhost", "localhost", 3500, 50001, "ABC" ); SoftAssertions.assertSoftly(softly -> { @@ -39,6 +39,7 @@ public void shouldCreateDaprClientPropertiesCorrectly() { softly.assertThat(properties.getHttpEndpoint()).isEqualTo("http://localhost"); softly.assertThat(properties.getHttpPort()).isEqualTo(3500); softly.assertThat(properties.getGrpcPort()).isEqualTo(50001); + softly.assertThat(properties.getApiToken()).isEqualTo("ABC"); }); } @@ -52,12 +53,14 @@ public void shouldSetDaprClientPropertiesCorrectly() { properties.setGrpcPort(50001); properties.setHttpEndpoint("http://localhost"); properties.setHttpPort(3500); + properties.setApiToken("ABC"); SoftAssertions.assertSoftly(softAssertions -> { softAssertions.assertThat(properties.getGrpcEndpoint()).isEqualTo("localhost"); softAssertions.assertThat(properties.getHttpEndpoint()).isEqualTo("http://localhost"); softAssertions.assertThat(properties.getHttpPort()).isEqualTo(3500); softAssertions.assertThat(properties.getGrpcPort()).isEqualTo(50001); + softAssertions.assertThat(properties.getApiToken()).isEqualTo("ABC"); }); } diff --git a/dapr-spring/dapr-spring-boot-tests/src/main/java/io/dapr/spring/boot/testcontainers/service/connection/DaprContainerConnectionDetailsFactory.java b/dapr-spring/dapr-spring-boot-tests/src/main/java/io/dapr/spring/boot/testcontainers/service/connection/DaprContainerConnectionDetailsFactory.java index e2c845368f..cf516345ec 100644 --- a/dapr-spring/dapr-spring-boot-tests/src/main/java/io/dapr/spring/boot/testcontainers/service/connection/DaprContainerConnectionDetailsFactory.java +++ b/dapr-spring/dapr-spring-boot-tests/src/main/java/io/dapr/spring/boot/testcontainers/service/connection/DaprContainerConnectionDetailsFactory.java @@ -54,5 +54,13 @@ public Integer getHttpPort() { public Integer getGrpcPort() { return getContainer().getGrpcPort(); } + + /* + * No API Token for local container + */ + @Override + public String getApiToken() { + return ""; + } } } diff --git a/sdk-workflows/src/main/java/io/dapr/workflows/client/DaprWorkflowClient.java b/sdk-workflows/src/main/java/io/dapr/workflows/client/DaprWorkflowClient.java index b24c8bcc96..d8b94edbeb 100644 --- a/sdk-workflows/src/main/java/io/dapr/workflows/client/DaprWorkflowClient.java +++ b/sdk-workflows/src/main/java/io/dapr/workflows/client/DaprWorkflowClient.java @@ -37,8 +37,7 @@ */ public class DaprWorkflowClient implements AutoCloseable { - private static final ClientInterceptor WORKFLOW_INTERCEPTOR = new ApiTokenClientInterceptor(); - + private ClientInterceptor workflowApiTokenInterceptor; private DurableTaskClient innerClient; private ManagedChannel grpcChannel; @@ -55,7 +54,7 @@ public DaprWorkflowClient() { * @param properties Properties for the GRPC Channel. */ public DaprWorkflowClient(Properties properties) { - this(NetworkUtils.buildGrpcManagedChannel(properties, WORKFLOW_INTERCEPTOR)); + this(NetworkUtils.buildGrpcManagedChannel(properties, new ApiTokenClientInterceptor(properties))); } /** diff --git a/sdk-workflows/src/main/java/io/dapr/workflows/internal/ApiTokenClientInterceptor.java b/sdk-workflows/src/main/java/io/dapr/workflows/internal/ApiTokenClientInterceptor.java index 97f12c3314..e5b4209d7b 100644 --- a/sdk-workflows/src/main/java/io/dapr/workflows/internal/ApiTokenClientInterceptor.java +++ b/sdk-workflows/src/main/java/io/dapr/workflows/internal/ApiTokenClientInterceptor.java @@ -24,6 +24,13 @@ import io.grpc.MethodDescriptor; public class ApiTokenClientInterceptor implements ClientInterceptor { + + private Properties properties; + + public ApiTokenClientInterceptor(Properties properties) { + this.properties = properties; + } + @Override public ClientCall interceptCall( MethodDescriptor methodDescriptor, @@ -34,7 +41,7 @@ public ClientCall interceptCall( return new ForwardingClientCall.SimpleForwardingClientCall(clientCall) { @Override public void start(final Listener responseListener, final Metadata metadata) { - String daprApiToken = Properties.API_TOKEN.get(); + String daprApiToken = properties.getValue(Properties.API_TOKEN); if (daprApiToken != null) { metadata.put(Metadata.Key.of(Headers.DAPR_API_TOKEN, Metadata.ASCII_STRING_MARSHALLER), daprApiToken); } diff --git a/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java b/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java index 7f1147a0d7..5daff77471 100644 --- a/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java +++ b/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java @@ -23,6 +23,7 @@ import io.grpc.ManagedChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -30,7 +31,7 @@ import java.util.concurrent.Executors; public class WorkflowRuntimeBuilder { - private static final ClientInterceptor WORKFLOW_INTERCEPTOR = new ApiTokenClientInterceptor(); + private ClientInterceptor workflowApiTokenInterceptor; private static volatile WorkflowRuntime instance; private final Logger logger; private final Set workflows = new HashSet<>(); @@ -62,7 +63,8 @@ public WorkflowRuntimeBuilder(Logger logger) { } private WorkflowRuntimeBuilder(Properties properties, Logger logger) { - this.managedChannel = NetworkUtils.buildGrpcManagedChannel(properties, WORKFLOW_INTERCEPTOR); + this.workflowApiTokenInterceptor = new ApiTokenClientInterceptor(properties); + this.managedChannel = NetworkUtils.buildGrpcManagedChannel(properties, workflowApiTokenInterceptor); this.builder = new DurableTaskGrpcWorkerBuilder().grpcChannel(this.managedChannel); this.logger = logger; }