使用Camel连接到Azure Blob时出现身份验证问题



我的目标是监视hello目录中是否有任何新文件创建。一旦创建了新文件,它应该触发API并将hello目录中创建的文件上传到azure中。我正处于异常以下。有人能帮我吗?

WatcherRoute.java

@Service
public class WatcherRoute extends RouteBuilder {

@Override
public void configure() {

String accessKey = "key";
String baseUrl = "base/url";


from("file-watch:hello?events=CREATE&antInclude=**/*.txt&recursive=true")
.to("direct:start","direct:uploadFileToBlob")
.end();

from("direct:uploadFileToBlob")
.to("azure-storage-blob://storage-account-name/containerName?blobName=test.txt&accessKey="+getBase64EncodedCipherText(accessKey))
.end();

from("direct:start")
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.setHeader("Content-Type",constant("application/json"))
.to(baseUrl)
.process(logResponse)
.end();
}

private String getBase64EncodedCipherText(String cipherText) {
byte[] cText = cipherText.getBytes();
return Base64.getEncoder().encodeToString(cText);
}
}

异常跟踪:

2021-12-29 09:33:59.604 ERROR 78488 --- [elFileWatchPoll] o.a.c.p.e.DefaultErrorHandler            : Failed delivery for (MessageId: 18CB93B18D0D95B-0000000000000001 on ExchangeId: 18CB93B18D0D95B-0000000000000001). Exhausted after delivery attempt: 1 caught: com.azure.storage.blob.models.BlobStorageException: If you are using a StorageSharedKeyCredential, and the server returned an error message that says 'Signature did not match', you can compare the string to sign with the one generated by the SDK. To log the string to sign, pass in the context key value pair 'Azure-Storage-Log-String-To-Sign': true to the appropriate method call.
If you are using a SAS token, and the server returned an error message that says 'Signature did not match', you can compare the string to sign with the one generated by the SDK. To log the string to sign, pass in the context key value pair 'Azure-Storage-Log-String-To-Sign': true to the appropriate generateSas method call.
Please remember to disable 'Azure-Storage-Log-String-To-Sign' before going to production as this string can potentially contain PII.
Status code 403, "<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:{id}
Time:2021-12-29T15:33:59.4459965Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request 'example' is not the same as any computed signature. Server used following string to sign: 'GET

您可以尝试使用以下解决方案:

解决方案1:如果您使用主连接字符串,请尝试将连接字符串更改为辅助

解决方案2:Azure存储的身份验证不仅仅是提供访问密钥的问题(这不是很安全(。您需要创建一个代表给定请求的签名字符串,使用HMAC-SHA256算法对该字符串进行签名(使用存储密钥进行签名(,并以64为基数对结果进行编码。看见https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx了解更多详细信息。

解决方案3:如果使用共享访问签名(SAS(进行身份验证,请检查其是否已过期,然后重新创建并再次运行。

有关更多详细信息,请参阅本SO线程:

最新更新