You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/03/07 15:37:44 UTC

[camel] branch master updated: CAMEL-14646: [camel-azure] Add the possibility to set credentials as query parameters (#3613)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 14da3fc  CAMEL-14646: [camel-azure] Add the possibility to set credentials as query parameters (#3613)
14da3fc is described below

commit 14da3fc8af5f0a9e4982a8c2ad035691ba1043c4
Author: Luigi De Masi <55...@users.noreply.github.com>
AuthorDate: Sat Mar 7 16:37:29 2020 +0100

    CAMEL-14646: [camel-azure] Add the possibility to set credentials as query parameters (#3613)
---
 .../azure/blob/BlobServiceComponentConfigurer.java |   4 +
 .../azure/blob/BlobServiceEndpointConfigurer.java  |   4 +
 .../queue/QueueServiceComponentConfigurer.java     |   4 +
 .../queue/QueueServiceEndpointConfigurer.java      |   4 +
 .../camel/component/azure/blob/azure-blob.json     |   8 +-
 .../camel/component/azure/queue/azure-queue.json   |   8 +-
 .../src/main/docs/azure-blob-component.adoc        |   8 +-
 .../src/main/docs/azure-queue-component.adoc       |   8 +-
 .../component/azure/blob/BlobServiceComponent.java |  11 +-
 .../component/azure/blob/BlobServiceUtil.java      |  12 +-
 .../azure/common/AbstractConfiguration.java        |  41 ++++
 .../azure/queue/QueueServiceComponent.java         |   8 +-
 .../component/azure/queue/QueueServiceUtil.java    |   8 +-
 ...lobServiceComponentConfigurationClientTest.java |  52 +----
 .../BlobServiceComponentConfigurationTest.java     |  33 +--
 .../component/azure/blob/BlobServiceUtilTest.java  |  14 +-
 .../azure/common/AzureCredentialsTest.java         | 224 +++++++++++++++++++++
 .../azure/common/AzureServiceCommonTestUtil.java   | 108 ++++++++++
 .../azure/common/MissingCredentialsTest.java       | 176 ++++++++++++++++
 ...eueServiceComponentClientConfigurationTest.java |  15 +-
 .../QueueServiceComponentConfigurationTest.java    |  15 +-
 .../azure/queue/QueueServiceUtilTest.java          |  16 +-
 .../dsl/AzureBlobComponentBuilderFactory.java      |  26 +++
 .../dsl/AzureQueueComponentBuilderFactory.java     |  26 +++
 .../dsl/BlobServiceEndpointBuilderFactory.java     |  72 +++++++
 .../dsl/QueueServiceEndpointBuilderFactory.java    |  72 +++++++
 .../modules/ROOT/pages/azure-blob-component.adoc   |   8 +-
 .../modules/ROOT/pages/azure-queue-component.adoc  |   8 +-
 28 files changed, 838 insertions(+), 155 deletions(-)

diff --git a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurer.java b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurer.java
index d4e7168..644f644 100644
--- a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurer.java
+++ b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurer.java
@@ -42,6 +42,10 @@ public class BlobServiceComponentConfigurer extends PropertyConfigurerSupport im
         case "closeStreamAfterWrite": getOrCreateConfiguration(target).setCloseStreamAfterWrite(property(camelContext, boolean.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.azure.blob.BlobServiceConfiguration.class, value)); return true;
         case "credentials": getOrCreateConfiguration(target).setCredentials(property(camelContext, com.microsoft.azure.storage.StorageCredentials.class, value)); return true;
+        case "credentialsaccountkey":
+        case "credentialsAccountKey": getOrCreateConfiguration(target).setCredentialsAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "credentialsaccountname":
+        case "credentialsAccountName": getOrCreateConfiguration(target).setCredentialsAccountName(property(camelContext, java.lang.String.class, value)); return true;
         case "datalength":
         case "dataLength": getOrCreateConfiguration(target).setDataLength(property(camelContext, java.lang.Long.class, value)); return true;
         case "filedir":
diff --git a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceEndpointConfigurer.java b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceEndpointConfigurer.java
index 396e891..da97c8d 100644
--- a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceEndpointConfigurer.java
+++ b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/blob/BlobServiceEndpointConfigurer.java
@@ -34,6 +34,10 @@ public class BlobServiceEndpointConfigurer extends PropertyConfigurerSupport imp
         case "closestreamafterwrite":
         case "closeStreamAfterWrite": target.getConfiguration().setCloseStreamAfterWrite(property(camelContext, boolean.class, value)); return true;
         case "credentials": target.getConfiguration().setCredentials(property(camelContext, com.microsoft.azure.storage.StorageCredentials.class, value)); return true;
+        case "credentialsaccountkey":
+        case "credentialsAccountKey": target.getConfiguration().setCredentialsAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "credentialsaccountname":
+        case "credentialsAccountName": target.getConfiguration().setCredentialsAccountName(property(camelContext, java.lang.String.class, value)); return true;
         case "datalength":
         case "dataLength": target.getConfiguration().setDataLength(property(camelContext, java.lang.Long.class, value)); return true;
         case "exceptionhandler":
diff --git a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurer.java b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurer.java
index 1ee4745..36ed4df 100644
--- a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurer.java
+++ b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurer.java
@@ -30,6 +30,10 @@ public class QueueServiceComponentConfigurer extends PropertyConfigurerSupport i
         case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.azure.queue.QueueServiceConfiguration.class, value)); return true;
         case "credentials": getOrCreateConfiguration(target).setCredentials(property(camelContext, com.microsoft.azure.storage.StorageCredentials.class, value)); return true;
+        case "credentialsaccountkey":
+        case "credentialsAccountKey": getOrCreateConfiguration(target).setCredentialsAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "credentialsaccountname":
+        case "credentialsAccountName": getOrCreateConfiguration(target).setCredentialsAccountName(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "messagetimetolive":
diff --git a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceEndpointConfigurer.java b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceEndpointConfigurer.java
index 5c8242b..f4b78d1 100644
--- a/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceEndpointConfigurer.java
+++ b/components/camel-azure/src/generated/java/org/apache/camel/component/azure/queue/QueueServiceEndpointConfigurer.java
@@ -22,6 +22,10 @@ public class QueueServiceEndpointConfigurer extends PropertyConfigurerSupport im
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
         case "credentials": target.getConfiguration().setCredentials(property(camelContext, com.microsoft.azure.storage.StorageCredentials.class, value)); return true;
+        case "credentialsaccountkey":
+        case "credentialsAccountKey": target.getConfiguration().setCredentialsAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "credentialsaccountname":
+        case "credentialsAccountName": target.getConfiguration().setCredentialsAccountName(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
diff --git a/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/blob/azure-blob.json b/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/blob/azure-blob.json
index 690e4b3..ff042b5 100644
--- a/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/blob/azure-blob.json
+++ b/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/blob/azure-blob.json
@@ -37,7 +37,9 @@
     "streamWriteSize": { "kind": "property", "displayName": "Stream Write Size", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Set the size of the buffer for writing block and page blocks" },
     "useFlatListing": { "kind": "property", "displayName": "Use Flat Listing", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Specify if the flat or hierarchical blob listing should be used" },
     "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
-    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "deprecated": false, "secret": false, "description": "The Blob Service configuration" }
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "deprecated": false, "secret": false, "description": "The Blob Service configuration" },
+    "credentialsAccountKey": { "kind": "property", "displayName": "Credentials Account Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account key used during authentication phase" },
+    "credentialsAccountName": { "kind": "property", "displayName": "Credentials Account Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account name used during authentication phase" }
   },
   "properties": {
     "containerOrBlobUri": { "kind": "path", "displayName": "Container Or Blob Uri", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Container or Blob compact Uri" },
@@ -61,6 +63,8 @@
     "streamWriteSize": { "kind": "parameter", "displayName": "Stream Write Size", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Set the size of the buffer for writing block and page blocks" },
     "useFlatListing": { "kind": "parameter", "displayName": "Use Flat Listing", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Specify if the flat or hierarchical blob listing should be used" },
     "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
-    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "credentialsAccountKey": { "kind": "parameter", "displayName": "Credentials Account Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account key used during authentication phase" },
+    "credentialsAccountName": { "kind": "parameter", "displayName": "Credentials Account Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.blob.BlobServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account name used during authentication phase" }
   }
 }
diff --git a/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/queue/azure-queue.json b/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/queue/azure-queue.json
index 3e2876d..96bd49f 100644
--- a/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/queue/azure-queue.json
+++ b/components/camel-azure/src/generated/resources/org/apache/camel/component/azure/queue/azure-queue.json
@@ -28,7 +28,9 @@
     "operation": { "kind": "property", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.azure.queue.QueueServiceOperations", "enum": [ "listQueues", "createQueue", "deleteQueue", "addMessage", "retrieveMessage", "peekMessage", "updateMessage", "deleteMessage" ], "deprecated": false, "secret": false, "defaultValue": "listQueues", "configurationClass": "org.apache.camel.component.azure.queue.Q [...]
     "queuePrefix": { "kind": "property", "displayName": "Queue Prefix", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "configurationField": "configuration", "description": "Set a prefix which can be used for listing the queues" },
     "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
-    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "deprecated": false, "secret": false, "description": "The Queue Service configuration" }
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "deprecated": false, "secret": false, "description": "The Queue Service configuration" },
+    "credentialsAccountKey": { "kind": "property", "displayName": "Credentials Account Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account key used during authentication phase" },
+    "credentialsAccountName": { "kind": "property", "displayName": "Credentials Account Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account name used during authentication phase" }
   },
   "properties": {
     "containerAndQueueUri": { "kind": "path", "displayName": "Container And Queue Uri", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Container Queue compact Uri" },
@@ -43,6 +45,8 @@
     "operation": { "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.azure.queue.QueueServiceOperations", "enum": [ "listQueues", "createQueue", "deleteQueue", "addMessage", "retrieveMessage", "peekMessage", "updateMessage", "deleteMessage" ], "deprecated": false, "secret": false, "defaultValue": "listQueues", "configurationClass": "org.apache.camel.component.azure.queue. [...]
     "queuePrefix": { "kind": "parameter", "displayName": "Queue Prefix", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "configurationField": "configuration", "description": "Set a prefix which can be used for listing the queues" },
     "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
-    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "credentialsAccountKey": { "kind": "parameter", "displayName": "Credentials Account Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account key used during authentication phase" },
+    "credentialsAccountName": { "kind": "parameter", "displayName": "Credentials Account Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.azure.queue.QueueServiceConfiguration", "configurationField": "configuration", "description": "Set the storage account name used during authentication phase" }
   }
 }
diff --git a/components/camel-azure/src/main/docs/azure-blob-component.adoc b/components/camel-azure/src/main/docs/azure-blob-component.adoc
index bbdd31a..5d7c81c 100644
--- a/components/camel-azure/src/main/docs/azure-blob-component.adoc
+++ b/components/camel-azure/src/main/docs/azure-blob-component.adoc
@@ -39,7 +39,7 @@ to("file://blobdirectory");
 
 
 // component options: START
-The Azure Storage Blob Service component supports 19 options, which are listed below.
+The Azure Storage Blob Service component supports 21 options, which are listed below.
 
 
 
@@ -65,6 +65,8 @@ The Azure Storage Blob Service component supports 19 options, which are listed b
 | *useFlatListing* (producer) | Specify if the flat or hierarchical blob listing should be used | true | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *configuration* (advanced) | The Blob Service configuration |  | BlobServiceConfiguration
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // component options: END
 
@@ -97,7 +99,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (21 parameters):
+=== Query Parameters (23 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -124,6 +126,8 @@ with the following path and query parameters:
 | *useFlatListing* (producer) | Specify if the flat or hierarchical blob listing should be used | true | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // endpoint options: END
 
diff --git a/components/camel-azure/src/main/docs/azure-queue-component.adoc b/components/camel-azure/src/main/docs/azure-queue-component.adoc
index 483cead..e353310 100644
--- a/components/camel-azure/src/main/docs/azure-queue-component.adoc
+++ b/components/camel-azure/src/main/docs/azure-queue-component.adoc
@@ -39,7 +39,7 @@ to("file://queuedirectory");
 
 
 // component options: START
-The Azure Storage Queue Service component supports 10 options, which are listed below.
+The Azure Storage Queue Service component supports 12 options, which are listed below.
 
 
 
@@ -56,6 +56,8 @@ The Azure Storage Queue Service component supports 10 options, which are listed
 | *queuePrefix* (producer) | Set a prefix which can be used for listing the queues |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *configuration* (advanced) | The Queue Service configuration |  | QueueServiceConfiguration
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // component options: END
 
@@ -88,7 +90,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (12 parameters):
+=== Query Parameters (14 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -106,6 +108,8 @@ with the following path and query parameters:
 | *queuePrefix* (producer) | Set a prefix which can be used for listing the queues |  | String
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // endpoint options: END
 
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
index d9d449c..8918845 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
@@ -28,9 +28,13 @@ import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.DefaultComponent;
 
+
 @Component("azure-blob")
 public class BlobServiceComponent extends DefaultComponent {
 
+    public static final String MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE =
+            "One of azureBlobClient, credentials or both credentialsAccountName and credentialsAccountKey must be specified";
+
     @Metadata(label = "advanced")
     private BlobServiceConfiguration configuration;
 
@@ -91,9 +95,12 @@ public class BlobServiceComponent extends DefaultComponent {
 
     private void checkCredentials(BlobServiceConfiguration cfg) {
         CloudBlob client = cfg.getAzureBlobClient();
-        StorageCredentials creds = client == null ? cfg.getCredentials() : client.getServiceClient().getCredentials();
+
+        //if no azureBlobClient is provided fallback to credentials
+        StorageCredentials creds = client == null ? cfg.getAccountCredentials()
+                : client.getServiceClient().getCredentials();
         if ((creds == null || creds instanceof StorageCredentialsAnonymous) && !cfg.isPublicForRead()) {
-            throw new IllegalArgumentException("Credentials must be specified.");
+            throw new IllegalArgumentException(MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE);
         }
     }
 
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceUtil.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceUtil.java
index 43726da..c4084e9 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceUtil.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceUtil.java
@@ -124,7 +124,7 @@ public final class BlobServiceUtil {
     public static CloudBlobContainer createBlobContainerClient(BlobServiceConfiguration cfg)
             throws Exception {
         URI uri = prepareStorageBlobUri(cfg, false);
-        StorageCredentials creds = getAccountCredentials(cfg);
+        StorageCredentials creds = cfg.getAccountCredentials();
         return new CloudBlobContainer(uri, creds);
     }
 
@@ -133,7 +133,7 @@ public final class BlobServiceUtil {
         CloudBlockBlob client = (CloudBlockBlob) getConfiguredClient(cfg);
         if (client == null) {
             URI uri = prepareStorageBlobUri(cfg);
-            StorageCredentials creds = getAccountCredentials(cfg);
+            StorageCredentials creds = cfg.getAccountCredentials();
             client = new CloudBlockBlob(uri, creds);
         }
         return client;
@@ -144,7 +144,7 @@ public final class BlobServiceUtil {
         CloudAppendBlob client = (CloudAppendBlob) getConfiguredClient(cfg);
         if (client == null) {
             URI uri = prepareStorageBlobUri(cfg);
-            StorageCredentials creds = getAccountCredentials(cfg);
+            StorageCredentials creds = cfg.getAccountCredentials();
             client = new CloudAppendBlob(uri, creds);
         }
         return client;
@@ -155,7 +155,7 @@ public final class BlobServiceUtil {
         CloudPageBlob client = (CloudPageBlob) getConfiguredClient(cfg);
         if (client == null) {
             URI uri = prepareStorageBlobUri(cfg);
-            StorageCredentials creds = getAccountCredentials(cfg);
+            StorageCredentials creds = cfg.getAccountCredentials();
             client = new CloudPageBlob(uri, creds);
         }
         return client;
@@ -182,10 +182,6 @@ public final class BlobServiceUtil {
         return client;
     }
 
-    public static StorageCredentials getAccountCredentials(BlobServiceConfiguration cfg) {
-        return cfg.getCredentials();
-    }
-
     public static void configureCloudBlobForRead(CloudBlob client, BlobServiceConfiguration cfg) {
         if (cfg.getStreamReadSize() > 0) {
             client.setStreamMinimumReadSizeInBytes(cfg.getStreamReadSize());
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/common/AbstractConfiguration.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/common/AbstractConfiguration.java
index 4be7429..d3361b6 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/common/AbstractConfiguration.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/common/AbstractConfiguration.java
@@ -17,12 +17,19 @@
 package org.apache.camel.component.azure.common;
 
 import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
 import org.apache.camel.spi.UriParam;
 
 public abstract class AbstractConfiguration implements Cloneable {
 
     @UriParam
     private StorageCredentials credentials;
+
+    @UriParam(label = "security", secret = true)
+    private String credentialsAccountKey;
+
+    @UriParam(label = "security", secret = true)
+    private String credentialsAccountName;
     
     private String accountName;
     
@@ -48,4 +55,38 @@ public abstract class AbstractConfiguration implements Cloneable {
     public void setCredentials(StorageCredentials credentials) {
         this.credentials = credentials;
     }
+
+    public String getCredentialsAccountKey() {
+        return credentialsAccountKey;
+    }
+
+    /**
+     * Set the storage account key used during authentication phase
+     */
+    public void setCredentialsAccountKey(String credentialsAccountKey) {
+        this.credentialsAccountKey = credentialsAccountKey;
+    }
+
+    public String getCredentialsAccountName() {
+        return credentialsAccountName;
+    }
+
+    /**
+     * Set the storage account name used during authentication phase
+     */
+    public void setCredentialsAccountName(String credentialsAccountName) {
+        this.credentialsAccountName = credentialsAccountName;
+    }
+
+    public  StorageCredentials getAccountCredentials() {
+        StorageCredentials creds = credentials;
+        //if  credentials is null, fallback to credentialsAccountKey and credentialsAccountName
+        if (creds == null) {
+            if (credentialsAccountKey != null && credentialsAccountName != null) {
+                creds = new StorageCredentialsAccountAndKey(credentialsAccountName, credentialsAccountKey);
+            }
+        }
+        return creds;
+
+    }
 }
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
index d0a2493..70972dc 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
@@ -26,8 +26,12 @@ import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.DefaultComponent;
 
+
 @Component("azure-queue")
 public class QueueServiceComponent extends DefaultComponent {
+
+    public static final String MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE =
+            "One of azureQueueClient, credentials or both credentialsAccountName and credentialsAccountKey must be specified";
     
     @Metadata(label = "advanced")
     private QueueServiceConfiguration configuration;
@@ -76,9 +80,9 @@ public class QueueServiceComponent extends DefaultComponent {
 
     private void checkCredentials(QueueServiceConfiguration cfg) {
         CloudQueue client = cfg.getAzureQueueClient();
-        StorageCredentials creds = client == null ? cfg.getCredentials() : client.getServiceClient().getCredentials();
+        StorageCredentials creds = client == null ? cfg.getAccountCredentials() : client.getServiceClient().getCredentials();
         if (creds == null) {
-            throw new IllegalArgumentException("Credentials must be specified.");
+            throw new IllegalArgumentException(MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE);
         }
     }
     
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java
index 7bde9d5..6032779 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java
@@ -45,7 +45,7 @@ public final class QueueServiceUtil {
         CloudQueue client = getConfiguredClient(cfg);
         if (client == null) {
             URI uri = prepareStorageQueueUri(cfg);
-            StorageCredentials creds = getAccountCredentials(cfg);
+            StorageCredentials creds = cfg.getAccountCredentials();
             client = new CloudQueue(uri, creds);
         }
         return client;
@@ -58,11 +58,7 @@ public final class QueueServiceUtil {
         }
         return client;
     }
-    
-    public static StorageCredentials getAccountCredentials(QueueServiceConfiguration cfg) {
-        return cfg.getCredentials();
-    }
-    
+
     public static void retrieveMessage(Exchange exchange, QueueServiceConfiguration cfg) throws Exception {
         CloudQueue client = createQueueClient(cfg);
         QueueServiceRequestOptions opts = getRequestOptions(exchange);  
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java
index bed9cb9..948c283 100644
--- a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java
@@ -119,60 +119,14 @@ public class BlobServiceComponentConfigurationClientTest extends CamelTestSuppor
         assertTrue(endpoint.getConfiguration().isPublicForRead());
         assertFalse(endpoint.getConfiguration().isUseFlatListing());
     }
-    
-    @Test
-    public void testNoClientAndCredentials() throws Exception {
-        try {
-            context.getEndpoint("azure-blob://camelazure/container/blob");
-            fail();
-        } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
-        }
-    }
+
     @Test
     public void testNoClientAndCredentialsPublicForRead() throws Exception {
         BlobServiceEndpoint endpoint =
-            (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
+                (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
         assertTrue(endpoint.getConfiguration().isPublicForRead());
     }
-    
-    @Test
-    public void testClientWithoutCredentials() throws Exception {
-        CloudBlockBlob client = 
-            new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
-        
-        doTestClientWithoutCredentials(client);
-    }
-    @Test
-    public void testClientWithoutAnonymousCredentials() throws Exception {
-        CloudBlockBlob client = 
-            new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"),
-                               StorageCredentialsAnonymous.ANONYMOUS);
-        
-        doTestClientWithoutCredentials(client);
-    }
-    @Test
-    public void testClientWithoutCredentialsPublicRead() throws Exception {
-        CloudBlockBlob client = 
-            new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
-        
-        context.getRegistry().bind("azureBlobClient", client);
-        
-        BlobServiceEndpoint endpoint =
-            (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
-        assertTrue(endpoint.getConfiguration().isPublicForRead());
-    }
-    private void doTestClientWithoutCredentials(CloudBlob client) throws Exception {
-        context.getRegistry().bind("azureBlobClient", client);
-        
-        try {
-            context.getEndpoint("azure-blob://camelazure/container/blob");
-            fail();
-        } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
-        }
-    }
-    
+
     @Test
     public void testNoBlobNameProducerWithOp() throws Exception {
         registerCredentials();
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationTest.java
index eb988ce..fbc5b77 100644
--- a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationTest.java
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationTest.java
@@ -119,38 +119,7 @@ public class BlobServiceComponentConfigurationTest extends CamelTestSupport {
         assertTrue(endpoint.getConfiguration().isPublicForRead());
         assertFalse(endpoint.getConfiguration().isUseFlatListing());
     }
-    
-    @Test
-    public void testNoClientAndCredentials() throws Exception {
-        try {
-            context.getEndpoint("azure-blob://camelazure/container/blob");
-            fail();
-        } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
-        }
-    }
-    @Test
-    public void testNoClientAndCredentialsPublicForRead() throws Exception {
-        BlobServiceEndpoint endpoint =
-            (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
-        assertTrue(endpoint.getConfiguration().isPublicForRead());
-    }
-    
-    @Test
-    public void testClientWithoutCredentials() throws Exception {
-        CloudBlockBlob client = 
-            new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
-        
-        doTestClientWithoutCredentials(client);
-    }
-    @Test
-    public void testClientWithoutAnonymousCredentials() throws Exception {
-        CloudBlockBlob client = 
-            new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"),
-                               StorageCredentialsAnonymous.ANONYMOUS);
-        
-        doTestClientWithoutCredentials(client);
-    }
+
     @Test
     public void testClientWithoutCredentialsPublicRead() throws Exception {
         CloudBlockBlob client = 
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceUtilTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceUtilTest.java
index 630cfb6..f163c7c 100644
--- a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceUtilTest.java
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceUtilTest.java
@@ -18,19 +18,18 @@ package org.apache.camel.component.azure.blob;
 
 import java.net.URI;
 
-import com.microsoft.azure.storage.StorageCredentials;
-import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
 import com.microsoft.azure.storage.blob.CloudAppendBlob;
 import com.microsoft.azure.storage.blob.CloudBlockBlob;
-import com.microsoft.azure.storage.core.Base64;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.registerCredentials;
+
 public class BlobServiceUtilTest extends CamelTestSupport {
 
     @Test
     public void testPrepareUri() throws Exception {
-        registerCredentials();
+        registerCredentials(context);
         
         BlobServiceEndpoint endpoint =
             (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?credentials=#creds");
@@ -84,11 +83,4 @@ public class BlobServiceUtilTest extends CamelTestSupport {
             assertEquals("Invalid Client URI", ex.getMessage());
         }
     }
-
-    private void registerCredentials() {
-        StorageCredentials creds = new StorageCredentialsAccountAndKey("camelazure",
-                                                                       Base64.encode("key".getBytes()));
-        context.getRegistry().bind("creds", creds);
-    }
-
 }
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/AzureCredentialsTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/AzureCredentialsTest.java
new file mode 100644
index 0000000..9ee0d98
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/AzureCredentialsTest.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.azure.common;
+
+import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
+import com.microsoft.azure.storage.blob.CloudBlob;
+import com.microsoft.azure.storage.blob.CloudBlockBlob;
+import com.microsoft.azure.storage.core.Base64;
+import com.microsoft.azure.storage.queue.CloudQueue;
+import org.apache.camel.ResolveEndpointFailedException;
+import org.apache.camel.component.azure.blob.BlobServiceConfiguration;
+import org.apache.camel.component.azure.blob.BlobServiceEndpoint;
+import org.apache.camel.component.azure.blob.BlobServiceUtil;
+import org.apache.camel.component.azure.queue.QueueServiceConfiguration;
+import org.apache.camel.component.azure.queue.QueueServiceEndpoint;
+import org.apache.camel.component.azure.queue.QueueServiceUtil;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.newAccountKeyCredentials;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.registerCredentials;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.registerBlockBlobClient;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.registerQueueClient;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.ACCOUNT_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.CONTAINER_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.BLOB_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.QUEUE_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.INLINE_CREDENTIALS_ACCOUNT_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.INLINE_CREDENTIALS_ACCOUNT_KEY;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.CREDENTIALS_ACCOUNT_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.CREDENTIALS_ACCOUNT_KEY;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.CLIENT_CREDENTIALS_ACCOUNT_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.CLIENT_CREDENTIALS_ACCOUNT_KEY;
+
+public class AzureCredentialsTest extends CamelTestSupport {
+
+    // URI with credentials
+
+    private String inlineCredentialBlobURIEndpoint = new StringBuilder()
+            .append("azure-blob://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(CONTAINER_NAME)
+            .append("/").append(BLOB_NAME)
+            .append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .append("&credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .toString();
+
+    private String inlineCredentialBlobURIAndCredentialRefEndpoint = new StringBuilder()
+            .append("azure-blob://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(CONTAINER_NAME)
+            .append("/").append(BLOB_NAME)
+            .append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .append("&credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .append("&credentials=#creds")
+            .toString();
+
+    private String inlineCredentialBlobURIAndCredentialRefEndpointAndAzureClient = new StringBuilder()
+            .append("azure-blob://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(CONTAINER_NAME)
+            .append("/").append(BLOB_NAME)
+            .append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .append("&credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .append("&credentials=#creds")
+            .append("&azureBlobClient=#blobClient")
+            .toString();
+
+    private String inlineCredentialQueueURIEndpoint = new StringBuilder()
+            .append("azure-queue://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(QUEUE_NAME)
+            .append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .append("&credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .toString();
+
+    private String inlineCredentialQueueURIAndCredentialRefEndpoint = new StringBuilder()
+            .append("azure-queue://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(QUEUE_NAME).append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .append("&credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .append("&credentials=#creds")
+            .toString();
+
+    private String inlineCredentialQueueURIAndCredentialRefEndpointAndAzureClient = new StringBuilder()
+            .append("azure-queue://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(QUEUE_NAME).append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .append("&credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .append("&credentials=#creds")
+            .append("&azureQueueClient=#queueClient")
+            .toString();
+
+    // Tests
+
+    //Blob Tests
+
+    @Test
+    public void createBlobEndpointWithAccountCredentials() throws Exception {
+        executeBlobAssertions(inlineCredentialBlobURIEndpoint, INLINE_CREDENTIALS_ACCOUNT_NAME, INLINE_CREDENTIALS_ACCOUNT_KEY);
+    }
+
+    @Test
+    public void createBlobEndpointWithAccountCredentialsAndCredentialsRef() throws Exception {
+        registerCredentials(context, CREDENTIALS_ACCOUNT_NAME, CREDENTIALS_ACCOUNT_KEY);
+        executeBlobAssertions(inlineCredentialBlobURIAndCredentialRefEndpoint, CREDENTIALS_ACCOUNT_NAME, CREDENTIALS_ACCOUNT_KEY);
+    }
+
+    @Test
+    public void createBlobEndpointWithAccountCredentialsAndCredentialsRefAndAzureClient() throws Exception {
+        registerCredentials(context, CREDENTIALS_ACCOUNT_NAME, CREDENTIALS_ACCOUNT_KEY);
+        registerBlockBlobClient(context, CLIENT_CREDENTIALS_ACCOUNT_NAME, CLIENT_CREDENTIALS_ACCOUNT_KEY);
+
+        BlobServiceEndpoint endpoint = (BlobServiceEndpoint)
+                context.getEndpoint(inlineCredentialBlobURIAndCredentialRefEndpointAndAzureClient);
+        CloudBlob client = context.getRegistry().lookupByNameAndType("blobClient", CloudBlockBlob.class);
+        executeBlobAccountCredentialsAssertion(client, endpoint.getConfiguration());
+        executeBlobCredentialsAssertion(client, CLIENT_CREDENTIALS_ACCOUNT_NAME, CLIENT_CREDENTIALS_ACCOUNT_KEY);
+    }
+
+    // Queue Tests
+
+    @Test
+    public void createQueueEndpointWithAccountCredentials() throws Exception {
+        executeQueueAssertions(inlineCredentialQueueURIEndpoint, INLINE_CREDENTIALS_ACCOUNT_NAME, INLINE_CREDENTIALS_ACCOUNT_KEY);
+    }
+
+    @Test
+    public void createQueueEndpointWithAccountCredentialsAndCredentialsRef() throws Exception {
+        registerCredentials(context, CREDENTIALS_ACCOUNT_NAME, CREDENTIALS_ACCOUNT_KEY);
+        executeQueueAssertions(inlineCredentialQueueURIAndCredentialRefEndpoint, CREDENTIALS_ACCOUNT_NAME, CREDENTIALS_ACCOUNT_KEY);
+    }
+
+    @Test
+    public void createQueueEndpointWithAccountCredentialsAndCredentialsRefAndAzureClient() throws Exception {
+        registerCredentials(context, CREDENTIALS_ACCOUNT_NAME, CREDENTIALS_ACCOUNT_KEY);
+        registerQueueClient(context, CLIENT_CREDENTIALS_ACCOUNT_NAME, CLIENT_CREDENTIALS_ACCOUNT_KEY);
+
+        QueueServiceEndpoint endpoint = (QueueServiceEndpoint) context.getEndpoint(inlineCredentialQueueURIAndCredentialRefEndpointAndAzureClient);
+        CloudQueue client = context.getRegistry().lookupByNameAndType("queueClient", CloudQueue.class);
+        executeQueueAccountCredentialsAssertion(client, endpoint.getConfiguration());
+        executeQueueCredentialsAssertion(client, CLIENT_CREDENTIALS_ACCOUNT_NAME, CLIENT_CREDENTIALS_ACCOUNT_KEY);
+    }
+    
+
+    private void executeQueueAssertions(String uriString, String expectedAccountName, String  expectedAccountKey) throws Exception {
+        QueueServiceEndpoint endpoint = (QueueServiceEndpoint) context.getEndpoint(uriString);
+        CloudQueue queueClient = QueueServiceUtil.createQueueClient(endpoint.getConfiguration());
+        executeQueueAccountCredentialsAssertion(queueClient, endpoint.getConfiguration());
+        executeQueueCredentialsAssertion(queueClient, expectedAccountName, expectedAccountKey);
+    }
+
+    private void executeQueueAccountCredentialsAssertion(CloudQueue client, QueueServiceConfiguration configuration) {
+        assertNotNull(client);
+        assertEquals(ACCOUNT_NAME, configuration.getAccountName());
+        assertEquals(INLINE_CREDENTIALS_ACCOUNT_NAME, configuration.getCredentialsAccountName());
+        assertEquals(INLINE_CREDENTIALS_ACCOUNT_KEY, configuration.getCredentialsAccountKey());
+    }
+
+    private void executeQueueCredentialsAssertion(CloudQueue client, String expectedAccountName, String expectedAccountKey) {
+        StorageCredentialsAccountAndKey credentials =
+                (StorageCredentialsAccountAndKey) client.getServiceClient().getCredentials();
+
+        assertNotNull(client.getServiceClient().getCredentials());
+        assertEquals(expectedAccountName, credentials.getAccountName());
+        assertEquals(expectedAccountKey, credentials.exportBase64EncodedKey());
+    }
+
+    private void executeBlobAssertions(String uriString, String expectedAccountName, String  expectedAccountKey) throws Exception {
+        BlobServiceEndpoint endpoint = (BlobServiceEndpoint) context.getEndpoint(uriString);
+
+        CloudBlob pageBlobClient = BlobServiceUtil.createPageBlobClient(endpoint.getConfiguration());
+        executeBlobAccountCredentialsAssertion(pageBlobClient, endpoint.getConfiguration());
+        executeBlobCredentialsAssertion(pageBlobClient, expectedAccountName, expectedAccountKey);
+
+        CloudBlob blockBlobClient = BlobServiceUtil.createBlockBlobClient(endpoint.getConfiguration());
+        executeBlobAccountCredentialsAssertion(blockBlobClient, endpoint.getConfiguration());
+        executeBlobCredentialsAssertion(blockBlobClient, expectedAccountName, expectedAccountKey);
+
+        CloudBlob appendBlobClient = BlobServiceUtil.createAppendBlobClient(endpoint.getConfiguration());
+        executeBlobAccountCredentialsAssertion(appendBlobClient, endpoint.getConfiguration());
+        executeBlobCredentialsAssertion(appendBlobClient, expectedAccountName, expectedAccountKey);
+    }
+
+    private void executeBlobAccountCredentialsAssertion(CloudBlob client, BlobServiceConfiguration configuration) {
+        assertNotNull(client);
+        assertEquals(ACCOUNT_NAME, configuration.getAccountName());
+        assertEquals(CONTAINER_NAME, configuration.getContainerName());
+        assertEquals(BLOB_NAME, configuration.getBlobName());
+        assertEquals(INLINE_CREDENTIALS_ACCOUNT_NAME, configuration.getCredentialsAccountName());
+        assertEquals(INLINE_CREDENTIALS_ACCOUNT_KEY, configuration.getCredentialsAccountKey());
+    }
+
+    private void executeBlobCredentialsAssertion(CloudBlob client, String expectedAccountName, String expectedAccountKey) {
+        StorageCredentialsAccountAndKey credentials = (StorageCredentialsAccountAndKey)
+                client.getServiceClient().getCredentials();
+        assertNotNull(client.getServiceClient().getCredentials());
+        assertEquals(expectedAccountName, credentials.getAccountName());
+        assertEquals(expectedAccountKey, credentials.exportBase64EncodedKey());
+    }
+}
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/AzureServiceCommonTestUtil.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/AzureServiceCommonTestUtil.java
new file mode 100644
index 0000000..6ca38e8
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/AzureServiceCommonTestUtil.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.azure.common;
+
+import java.net.URI;
+
+import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
+import com.microsoft.azure.storage.blob.CloudBlockBlob;
+import com.microsoft.azure.storage.core.Base64;
+import com.microsoft.azure.storage.queue.CloudQueue;
+import org.apache.camel.CamelContext;
+
+
+public final class AzureServiceCommonTestUtil {
+
+    public static final String ACCOUNT_NAME = "camelazure";
+    public static final String CONTAINER_NAME = "container1";
+    public static final String BLOB_NAME = "blobBlock";
+    public static final String INLINE_CREDENTIALS_ACCOUNT_NAME = "xxxx";
+    public static final String INLINE_CREDENTIALS_ACCOUNT_KEY = Base64.encode("yyyy".getBytes());
+    public static final String CREDENTIALS_ACCOUNT_NAME = "aaaa";
+    public static final String CREDENTIALS_ACCOUNT_KEY = Base64.encode("bbbb".getBytes());
+    public static final String CLIENT_CREDENTIALS_ACCOUNT_NAME = "cccc";
+    public static final String CLIENT_CREDENTIALS_ACCOUNT_KEY = Base64.encode("dddd".getBytes());
+    public static final String QUEUE_NAME = "myQueue";
+
+    private static final String DEFAULT_ACCOUNT_NAME = "camelazure";
+    private static final String DEFAULT_ACCOUNT_KEY = Base64.encode("camelazure".getBytes());
+
+
+    private AzureServiceCommonTestUtil() { }
+
+    // Credentials
+
+    public static void registerCredentials(CamelContext context, String accountName, String accountKey) {
+        context.getRegistry().bind("creds", newAccountKeyCredentials(accountName, accountKey));
+    }
+
+    public static void registerCredentials(CamelContext context) {
+        context.getRegistry().bind("creds", newAccountKeyCredentials(DEFAULT_ACCOUNT_NAME, DEFAULT_ACCOUNT_KEY));
+    }
+
+    //  BlobClient
+
+    public static void registerBlockBlobClient(CamelContext context) throws Exception {
+        context.getRegistry().bind("blobClient", createBlockBlobClient());
+    }
+
+    public static void registerBlockBlobClient(CamelContext context, String accountName, String accountKey) throws Exception {
+        context.getRegistry().bind("blobClient", createBlockBlobClient(accountName, accountKey));
+    }
+
+    public static CloudBlockBlob createBlockBlobClient(String accountName, String accountKey) throws Exception {
+        URI uri = new URI("https://camelazure.blob.core.windows.net/container1/blobBlock");
+        CloudBlockBlob client = new CloudBlockBlob(uri, newAccountKeyCredentials(accountName, accountKey));
+        return client;
+    }
+
+    public static CloudBlockBlob createBlockBlobClient() throws Exception {
+        return createBlockBlobClient(DEFAULT_ACCOUNT_NAME, DEFAULT_ACCOUNT_KEY);
+    }
+
+    //Queue Client
+
+    public static void registerQueueClient(CamelContext context, String accountName, String accountKey) throws Exception {
+        context.getRegistry().bind("queueClient", createQueueClient(accountName, accountKey));
+    }
+
+    public static void registerQueueClient(CamelContext context) throws Exception {
+        registerQueueClient(context, DEFAULT_ACCOUNT_NAME, DEFAULT_ACCOUNT_KEY);
+    }
+
+    public static CloudQueue createQueueClient(String accountName, String accountKey) throws Exception {
+        URI uri = new URI("https://camelazure.queue.core.windows.net/testqueue/");
+        CloudQueue client = new CloudQueue(uri, newAccountKeyCredentials(accountName, accountKey));
+        return client;
+    }
+
+    public static CloudQueue createQueueClient() throws Exception {
+        return createQueueClient(DEFAULT_ACCOUNT_NAME, DEFAULT_ACCOUNT_KEY);
+    }
+
+
+    // AccountCredentials
+
+    public static StorageCredentials newAccountKeyCredentials(String accountName, String accountKey) {
+        return new StorageCredentialsAccountAndKey(accountName, accountKey);
+    }
+
+    public static StorageCredentials newAccountKeyCredentials() {
+        return newAccountKeyCredentials(DEFAULT_ACCOUNT_NAME, DEFAULT_ACCOUNT_KEY);
+    }
+}
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/MissingCredentialsTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/MissingCredentialsTest.java
new file mode 100644
index 0000000..7038fd4
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/common/MissingCredentialsTest.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.azure.common;
+
+import java.net.URI;
+
+import com.microsoft.azure.storage.StorageCredentialsAnonymous;
+import com.microsoft.azure.storage.blob.CloudBlockBlob;
+import org.apache.camel.ResolveEndpointFailedException;
+import org.apache.camel.component.azure.blob.BlobServiceEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.ACCOUNT_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.CONTAINER_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.BLOB_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.QUEUE_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.INLINE_CREDENTIALS_ACCOUNT_NAME;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.INLINE_CREDENTIALS_ACCOUNT_KEY;
+import static org.apache.camel.component.azure.blob.BlobServiceComponent.MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE;
+import static org.apache.camel.component.azure.queue.QueueServiceComponent.MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE;
+
+
+public class MissingCredentialsTest extends CamelTestSupport {
+
+    @Rule
+    public ExpectedException exceptionRule = ExpectedException.none();
+
+    //Missing credentials
+    private String missingCredentialsBlobUriEndoint = new StringBuilder()
+            .append("azure-blob://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(CONTAINER_NAME)
+            .append("/").append(BLOB_NAME)
+            .toString();
+
+    private String missingCredentialsAccountNameBlobUriEndoint = new StringBuilder()
+            .append("azure-blob://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(CONTAINER_NAME)
+            .append("/").append(BLOB_NAME)
+            .append("?")
+            .append("credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .toString();
+
+    private String missingCredentialsAccountKeyBlobUriEndoint = new StringBuilder()
+            .append("azure-blob://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(CONTAINER_NAME)
+            .append("/").append(BLOB_NAME)
+            .append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .toString();
+
+    private String missingCredentialsQueueUriEndoint = new StringBuilder()
+            .append("azure-queue://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(QUEUE_NAME)
+            .toString();
+
+    private String missingCredentialsAccountNameQueueUriEndoint = new StringBuilder()
+            .append("azure-queue://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(QUEUE_NAME)
+            .append("?")
+            .append("credentialsAccountKey=RAW(").append(INLINE_CREDENTIALS_ACCOUNT_KEY).append(")")
+            .toString();
+
+    private String missingCredentialsAccountKeyQueueUriEndoint = new StringBuilder()
+            .append("azure-queue://")
+            .append(ACCOUNT_NAME)
+            .append("/").append(QUEUE_NAME)
+            .append("?")
+            .append("credentialsAccountName=").append(INLINE_CREDENTIALS_ACCOUNT_NAME)
+            .toString();
+
+
+    // Missing Credentials Blob Tests
+    @Test
+    public void createBlobEndpointWithoutCredentials() {
+        createEndpointWithoutCredentials(missingCredentialsBlobUriEndoint, MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE);
+    }
+
+    @Test
+    public void testNoClientAndCredentialsPublicForRead() throws Exception {
+        BlobServiceEndpoint endpoint =
+                (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
+        assertTrue(endpoint.getConfiguration().isPublicForRead());
+    }
+
+    @Test
+    public void createBlobEndpointWithoutCredentialsAccountName() {
+        createEndpointWithoutCredentials(missingCredentialsAccountNameBlobUriEndoint, MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE);
+    }
+
+    @Test
+    public void createBlobEndpointWithoutCredentialsAccountKey() {
+        createEndpointWithoutCredentials(missingCredentialsAccountKeyBlobUriEndoint, MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE);
+    }
+
+    // Missing Credentials Queue Tests
+    @Test
+    public void createQueueEndpointWithoutCredentials() {
+        createEndpointWithoutCredentials(missingCredentialsQueueUriEndoint, MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE);
+    }
+
+    @Test
+    public void createQueueEndpointWithoutCredentialsAccountName() {
+        createEndpointWithoutCredentials(missingCredentialsAccountNameQueueUriEndoint, MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE);
+    }
+
+    @Test
+    public void createQueueEndpointWithoutCredentialsAccountKey() {
+        createEndpointWithoutCredentials(missingCredentialsAccountKeyQueueUriEndoint, MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE);
+    }
+
+
+    // Client Tests
+
+    @Test
+    public void testBlobClientWithoutCredentialsPublicRead() throws Exception {
+        CloudBlockBlob client =
+                new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
+
+        context.getRegistry().bind("azureBlobClient", client);
+
+        BlobServiceEndpoint endpoint =
+                (BlobServiceEndpoint) context.getEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
+        assertTrue(endpoint.getConfiguration().isPublicForRead());
+    }
+
+    @Test
+    public void testBlobClientWithoutAnonymousCredentials() throws Exception {
+        exceptionRule.expect(ResolveEndpointFailedException.class);
+        exceptionRule.expectMessage(MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE);
+        CloudBlockBlob client =
+                new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"),
+                        StorageCredentialsAnonymous.ANONYMOUS);
+        context.getRegistry().bind("azureBlobClient", client);
+        context.getEndpoint("azure-blob://camelazure/container/blob");
+    }
+
+    @Test
+    public void testBlobClientWithoutCredentials() throws Exception {
+        exceptionRule.expect(ResolveEndpointFailedException.class);
+        exceptionRule.expectMessage(MISSING_BLOB_CREDNTIALS_EXCEPTION_MESSAGE);
+        CloudBlockBlob client =
+                new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
+        context.getRegistry().bind("azureBlobClient", client);
+        context.getEndpoint("azure-blob://camelazure/container/blob");
+
+    }
+
+
+    private void createEndpointWithoutCredentials(String uri, String errorMessage) {
+        exceptionRule.expect(ResolveEndpointFailedException.class);
+        exceptionRule.expectMessage(errorMessage);
+        context.getEndpoint(uri);
+    }
+}
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java
index ee64a3e..8ef0fdc 100644
--- a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java
@@ -28,6 +28,8 @@ import org.apache.camel.Processor;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
+import static org.apache.camel.component.azure.queue.QueueServiceComponent.MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE;
+
 public class QueueServiceComponentClientConfigurationTest extends CamelTestSupport {
     
     @Test
@@ -103,16 +105,7 @@ public class QueueServiceComponentClientConfigurationTest extends CamelTestSuppo
         
         createConsumer(endpoint);
     }
-    
-    @Test
-    public void testNoCredentials() throws Exception {
-        try {
-            context.getEndpoint("azure-queue://camelazure/testqueue");
-            fail();
-        } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
-        }
-    }
+
     
     @Test
     public void testTooManyPathSegments() throws Exception {
@@ -130,7 +123,7 @@ public class QueueServiceComponentClientConfigurationTest extends CamelTestSuppo
             context.getEndpoint("azure-queue://camelazure?operation=addMessage");
             fail();
         } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
+            assertEquals(MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE, ex.getCause().getMessage());
         }
     }
     
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java
index 4ce823a..8176972 100644
--- a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java
@@ -28,6 +28,8 @@ import org.apache.camel.Processor;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
+import static org.apache.camel.component.azure.queue.QueueServiceComponent.MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE;
+
 public class QueueServiceComponentConfigurationTest extends CamelTestSupport {
     
     @Test
@@ -103,16 +105,7 @@ public class QueueServiceComponentConfigurationTest extends CamelTestSupport {
         
         createConsumer(endpoint);
     }
-    
-    @Test
-    public void testNoCredentials() throws Exception {
-        try {
-            context.getEndpoint("azure-queue://camelazure/testqueue");
-            fail();
-        } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
-        }
-    }
+
     
     @Test
     public void testTooManyPathSegments() throws Exception {
@@ -130,7 +123,7 @@ public class QueueServiceComponentConfigurationTest extends CamelTestSupport {
             context.getEndpoint("azure-queue://camelazure?operation=addMessage");
             fail();
         } catch (Exception ex) {
-            assertEquals("Credentials must be specified.", ex.getCause().getMessage());
+            assertEquals(MISSING_QUEUE_CREDNTIALS_EXCEPTION_MESSAGE, ex.getCause().getMessage());
         }
     }
     
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java
index 516117c..52be8af 100644
--- a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java
@@ -18,18 +18,19 @@ package org.apache.camel.component.azure.queue;
 
 import java.net.URI;
 
-import com.microsoft.azure.storage.StorageCredentials;
-import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
-import com.microsoft.azure.storage.core.Base64;
 import com.microsoft.azure.storage.queue.CloudQueue;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.newAccountKeyCredentials;
+import static org.apache.camel.component.azure.common.AzureServiceCommonTestUtil.registerCredentials;
+
+
 public class QueueServiceUtilTest extends CamelTestSupport {
 
     @Test
     public void testPrepareUri() throws Exception {
-        registerCredentials();
+        registerCredentials(context);
 
         QueueServiceEndpoint endpoint = (QueueServiceEndpoint) context.getEndpoint("azure-queue://camelazure/testqueue?credentials=#creds");
         URI uri = QueueServiceUtil.prepareStorageQueueUri(endpoint.getConfiguration());
@@ -61,11 +62,4 @@ public class QueueServiceUtilTest extends CamelTestSupport {
         }
     }
 
-    private void registerCredentials() {
-        context.getRegistry().bind("creds", newAccountKeyCredentials());
-    }
-
-    private StorageCredentials newAccountKeyCredentials() {
-        return new StorageCredentialsAccountAndKey("camelazure", Base64.encode("key".getBytes()));
-    }
 }
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureBlobComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureBlobComponentBuilderFactory.java
index 933a596..2f9161a 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureBlobComponentBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureBlobComponentBuilderFactory.java
@@ -303,6 +303,30 @@ public interface AzureBlobComponentBuilderFactory {
             doSetProperty("configuration", configuration);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default AzureBlobComponentBuilder credentialsAccountKey(
+                java.lang.String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default AzureBlobComponentBuilder credentialsAccountName(
+                java.lang.String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     class AzureBlobComponentBuilderImpl
@@ -346,6 +370,8 @@ public interface AzureBlobComponentBuilderFactory {
             case "useFlatListing": getOrCreateConfiguration((BlobServiceComponent) component).setUseFlatListing((boolean) value); return true;
             case "basicPropertyBinding": ((BlobServiceComponent) component).setBasicPropertyBinding((boolean) value); return true;
             case "configuration": ((BlobServiceComponent) component).setConfiguration((org.apache.camel.component.azure.blob.BlobServiceConfiguration) value); return true;
+            case "credentialsAccountKey": getOrCreateConfiguration((BlobServiceComponent) component).setCredentialsAccountKey((java.lang.String) value); return true;
+            case "credentialsAccountName": getOrCreateConfiguration((BlobServiceComponent) component).setCredentialsAccountName((java.lang.String) value); return true;
             default: return false;
             }
         }
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureQueueComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureQueueComponentBuilderFactory.java
index 7df5017..a9dfa34 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureQueueComponentBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureQueueComponentBuilderFactory.java
@@ -193,6 +193,30 @@ public interface AzureQueueComponentBuilderFactory {
             doSetProperty("configuration", configuration);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default AzureQueueComponentBuilder credentialsAccountKey(
+                java.lang.String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default AzureQueueComponentBuilder credentialsAccountName(
+                java.lang.String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     class AzureQueueComponentBuilderImpl
@@ -227,6 +251,8 @@ public interface AzureQueueComponentBuilderFactory {
             case "queuePrefix": getOrCreateConfiguration((QueueServiceComponent) component).setQueuePrefix((java.lang.String) value); return true;
             case "basicPropertyBinding": ((QueueServiceComponent) component).setBasicPropertyBinding((boolean) value); return true;
             case "configuration": ((QueueServiceComponent) component).setConfiguration((org.apache.camel.component.azure.queue.QueueServiceConfiguration) value); return true;
+            case "credentialsAccountKey": getOrCreateConfiguration((QueueServiceComponent) component).setCredentialsAccountKey((java.lang.String) value); return true;
+            case "credentialsAccountName": getOrCreateConfiguration((QueueServiceComponent) component).setCredentialsAccountName((java.lang.String) value); return true;
             default: return false;
             }
         }
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BlobServiceEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BlobServiceEndpointBuilderFactory.java
index 01892c4..8cfcba7 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BlobServiceEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BlobServiceEndpointBuilderFactory.java
@@ -297,6 +297,30 @@ public interface BlobServiceEndpointBuilderFactory {
             doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default BlobServiceEndpointConsumerBuilder credentialsAccountKey(
+                String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default BlobServiceEndpointConsumerBuilder credentialsAccountName(
+                String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     /**
@@ -832,6 +856,30 @@ public interface BlobServiceEndpointBuilderFactory {
             doSetProperty("useFlatListing", useFlatListing);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default BlobServiceEndpointProducerBuilder credentialsAccountKey(
+                String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default BlobServiceEndpointProducerBuilder credentialsAccountName(
+                String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     /**
@@ -1121,6 +1169,30 @@ public interface BlobServiceEndpointBuilderFactory {
             doSetProperty("streamReadSize", streamReadSize);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default BlobServiceEndpointBuilder credentialsAccountKey(
+                String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default BlobServiceEndpointBuilder credentialsAccountName(
+                String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     /**
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/QueueServiceEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/QueueServiceEndpointBuilderFactory.java
index 5dbad883..521afb0 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/QueueServiceEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/QueueServiceEndpointBuilderFactory.java
@@ -133,6 +133,30 @@ public interface QueueServiceEndpointBuilderFactory {
             doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default QueueServiceEndpointConsumerBuilder credentialsAccountKey(
+                String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default QueueServiceEndpointConsumerBuilder credentialsAccountName(
+                String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     /**
@@ -451,6 +475,30 @@ public interface QueueServiceEndpointBuilderFactory {
             doSetProperty("queuePrefix", queuePrefix);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default QueueServiceEndpointProducerBuilder credentialsAccountKey(
+                String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default QueueServiceEndpointProducerBuilder credentialsAccountName(
+                String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     /**
@@ -581,6 +629,30 @@ public interface QueueServiceEndpointBuilderFactory {
             doSetProperty("credentials", credentials);
             return this;
         }
+        /**
+         * Set the storage account key used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default QueueServiceEndpointBuilder credentialsAccountKey(
+                String credentialsAccountKey) {
+            doSetProperty("credentialsAccountKey", credentialsAccountKey);
+            return this;
+        }
+        /**
+         * Set the storage account name used during authentication phase.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default QueueServiceEndpointBuilder credentialsAccountName(
+                String credentialsAccountName) {
+            doSetProperty("credentialsAccountName", credentialsAccountName);
+            return this;
+        }
     }
 
     /**
diff --git a/docs/components/modules/ROOT/pages/azure-blob-component.adoc b/docs/components/modules/ROOT/pages/azure-blob-component.adoc
index 536fe3e..7a63242 100644
--- a/docs/components/modules/ROOT/pages/azure-blob-component.adoc
+++ b/docs/components/modules/ROOT/pages/azure-blob-component.adoc
@@ -40,7 +40,7 @@ to("file://blobdirectory");
 
 
 // component options: START
-The Azure Storage Blob Service component supports 19 options, which are listed below.
+The Azure Storage Blob Service component supports 21 options, which are listed below.
 
 
 
@@ -66,6 +66,8 @@ The Azure Storage Blob Service component supports 19 options, which are listed b
 | *useFlatListing* (producer) | Specify if the flat or hierarchical blob listing should be used | true | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *configuration* (advanced) | The Blob Service configuration |  | BlobServiceConfiguration
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // component options: END
 
@@ -98,7 +100,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (21 parameters):
+=== Query Parameters (23 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -125,6 +127,8 @@ with the following path and query parameters:
 | *useFlatListing* (producer) | Specify if the flat or hierarchical blob listing should be used | true | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // endpoint options: END
 
diff --git a/docs/components/modules/ROOT/pages/azure-queue-component.adoc b/docs/components/modules/ROOT/pages/azure-queue-component.adoc
index 60130aa..498161d 100644
--- a/docs/components/modules/ROOT/pages/azure-queue-component.adoc
+++ b/docs/components/modules/ROOT/pages/azure-queue-component.adoc
@@ -40,7 +40,7 @@ to("file://queuedirectory");
 
 
 // component options: START
-The Azure Storage Queue Service component supports 10 options, which are listed below.
+The Azure Storage Queue Service component supports 12 options, which are listed below.
 
 
 
@@ -57,6 +57,8 @@ The Azure Storage Queue Service component supports 10 options, which are listed
 | *queuePrefix* (producer) | Set a prefix which can be used for listing the queues |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *configuration* (advanced) | The Queue Service configuration |  | QueueServiceConfiguration
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // component options: END
 
@@ -89,7 +91,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (12 parameters):
+=== Query Parameters (14 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -107,6 +109,8 @@ with the following path and query parameters:
 | *queuePrefix* (producer) | Set a prefix which can be used for listing the queues |  | String
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *credentialsAccountKey* (security) | Set the storage account key used during authentication phase |  | String
+| *credentialsAccountName* (security) | Set the storage account name used during authentication phase |  | String
 |===
 // endpoint options: END