在Microsoft Flow中调用Azure Rest API时,未以正确的格式错误给出身份验证信息

时间:2018-09-21 00:18:34

标签: rest azure authorization azure-storage microsoft-flow

当我尝试在Microsoft Flow中调用此https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-metadata API时,总是收到400错误请求的错误。

我编辑了关于此答案https://stackoverflow.com/a/22029178/10389562的授权标头,但无法理解我在做什么错。

Method: GET
Uri: https://myaccount.blob.core.windows.net/containername/blobname?comp=metadata
Headers :
{
  "Authorization": "SharedKey storageaccountname: primary key in the storage 
   account properties",
  "x-ms-date": "Thu, 21 Sep 2018 23:45:00 GMT",
  "x-ms-version": "2018-03-28"
}

调用此API后,我得到了此输出

<?xml version="1.0" encoding="utf-8"?><Error> 
<Code>InvalidAuthenticationInfo</Code><Message>Authentication information is 
not given in the correct format. Check the value of Authorization header.
RequestId:f3b3051b-601e-00a4-4b3c-51c58d000000
Time:2018-09-20T23:46:40.6659210Z</Message></Error>

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

更新

在Microsoft Flow中,对Azure存储调用Rest Api似乎不是有效的方法。授权需要由流发送的x-ms- *标头(例如x-ms-tracking-id,x-ms-workflow-id等)添加到stringStr中,这不受我们的控制。而且,签名自生成以来仅有效15m。

有一个内置的Get Blob Metadata操作。对于存储,还可以使用其他常见操作。

要设置blob元数据,建议将逻辑托管在Azure函数中。

  1. 按照this tutorial创建Function应用程序和httptrigger函数,请记住选择要在其中设置blob元数据的存储帐户。

  2. 用下面的代码替换httptrigger示例,并根据需要修改metadataName

    #r "Microsoft.WindowsAzure.Storage"
    
    using System.Net;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Blob;
    
    public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
    {
        dynamic data = await req.Content.ReadAsAsync<object>();
    
        if (data == null)
        {
            return req.CreateResponse(HttpStatusCode.BadRequest, "No request body posted");
        }
        else
        {
            string metadata = data.metadata;
            string blobName = data.blobName;
            string containerName = data.containerName;
    
            try
            {
                CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureWebJobsStorage"));
                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
                CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
                CloudBlob blob = blobContainer.GetBlobReference(blobName);
    
                blob.Metadata.Add("metadataName", metadata);
                blob.SetMetadata();
            }
            catch (Exception e)
            {
                log.Error(e.ToString());
                return req.CreateResponse(HttpStatusCode.InternalServerError, "Fail to set metadata");
            }
    
            return (string.IsNullOrEmpty(metadata) || string.IsNullOrEmpty(blobName) || string.IsNullOrEmpty(containerName))
                ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass necessary parameters in the request body")
                : req.CreateResponse(HttpStatusCode.OK, $"Metadata of {blobName} has been set");
        }
    }
    
  3. 在Microsoft Flow中,创建一个Http操作,将下面的内容发布到步骤2中获得的函数url中。

    {
        "metadata": "test",
        "blobName":"myblob",
        "containerName":"mycontainer"
    }