При аутентификации Azure Rest API в Microsoft Flow информация аутентификации не отображается в правильном формате. - PullRequest
0 голосов
/ 21 сентября 2018

Когда я пытаюсь вызвать это https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-metadata API в потоке Microsoft, я всегда получаю эту ошибку с 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 голосов
/ 21 сентября 2018

Обновление

В Microsoft Flow вызов Rest Api для хранилища Azure кажется недопустимым.Для авторизации нужны заголовки x-ms- *, отправляемые потоком (например, x-ms-tracking-id, x-ms-workflow-id и т. Д.), Добавляемые в stringStr, который не находится под нашим контролем.Более того, подпись действительна только в течение 15 м с момента ее создания.

Есть встроенное действие Get Blob Metadata.А для хранилища доступны и другие общие действия.

Чтобы задать метаданные BLOB-объектов, я предлагаю разместить логику в функции Azure.

  1. Follow thisучебное пособие для создания приложения 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, опубликуйте содержимое ниже для URL-адреса функции, полученной на шаге 2.

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