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

问题描述 投票:0回答:2

我的目标是监视 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
spring-boot apache-camel azure-blob-storage spring-camel
2个回答
0
投票

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

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

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

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

有关更多详细信息,请参阅此SO Thread


0
投票

这个问题解决了吗?看到同样的错误

© www.soinside.com 2019 - 2024. All rights reserved.