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

zphenhs4  于 2022-11-23  发布在  Apache
关注(0)|答案(1)|浏览(124)

我的目标是监控hello目录是否有任何新文件创建。一旦新文件创建,它应该触发API并将在hello目录中创建的文件上传到Azure。我遇到以下异常。有人能帮助我吗?

观察者路由.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
laik7k3q

laik7k3q1#

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

解决方案1:如果使用的是主连接字符串,请尝试将连接字符串更改为辅助
解决方案2:Azure存储的身份验证不仅仅是提供访问密钥(这不是很安全)。你需要创建表示给定请求的签名字符串,使用HMAC-SHA 256算法(使用你的存储密钥进行签名)对字符串进行签名,并以Base 64对结果进行编码。有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx
**解决方案3:如果您使用共享访问签名(SAS)**进行身份验证,请检查其是否已过期,然后重新创建并再次运行。

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

相关问题