Разрешения ключа SAS, которые изменяются при использовании blobserviceclient

#reactjs #azure-blob-storage #azure-webapps

Вопрос:

Я пытаюсь загрузить файлы в хранилище больших двоичных объектов в azure из веб-приложения react, но у меня возникли проблемы с подписью в заголовке авторизации.

Вот как выглядит sasToken в моем коде

 const sasToken = `sv=2020-08-04amp;ss=bfqtamp;srt=scoamp;sp=rwdlacupxamp;se=2021-09-22T00:41:33Zamp;st=2021-09-20T16:41:33Zamp;spr=httpsamp;sig=svP/ecNOoteE%2**************=`;
const containerName = `containername`;
const storageAccountName = "acountname";
 

Вот как это выглядит при выполнении запросов GET и PUT getBlobsInContainer и createBlobinContainer.
sv=2020-08-04amp;ss=bfqtamp;srt=scoamp;sp=ghosteryamp;se=2021-09-22T00:41:33Zamp;st=2021-09-20T16:41:33Zamp;spr=httpsamp;sig=svP/FecNOoteE/**************=
Это каким-то образом перезаписывает параметр разрешения в токене.

https://accountname.blob.core.windows.net/containername?SASamp;comp=список и тип данных=контейнерamp;_=1632199288178
Это результат запроса GET, который пытается выполнить мой код
Это запрос GET, когда я изменяю URL-адрес, мои коды пытаются получить доступ к разрешениям rwdlacupx

3 функции, с которыми мне приходится иметь дело.

 // return list of blobs in container to display
const getBlobsInContainer = async (containerClient) => {
  const returnedBlobUrls = [];
  // get list of blobs in container
  // eslint-disable-next-line
  for await (const blob of containerClient.listBlobsFlat()) {
    // if image is public, just construct URL
    returnedBlobUrls.push(
      `https://${storageAccountName}.blob.core.windows.net/${containerName}/${blob.name}`
    );
  }

  return returnedBlobUrls;
};


const createBlobInContainer = async (containerClient, file) => {
  console.log(`initialising blobclient for ${file.name}`);
  // create blobClient for container
  const blobClient = containerClient.getBlockBlobClient(file.name);
  console.log("blobclient generated");
  // set mimetype as determined from browser with file upload control
  const options = { blobHTTPHeaders: { blobContentType: file.type } };

  // upload file
  await blobClient.uploadBrowserData(file, options);
  console.log("Adding Metadata");
  await blobClient.setMetadata({UserName : 'Reynolds'});
};

const uploadFileToBlob = async (file) => {
  if (!file) return [];
  // get BlobService = notice `?` is pulled out of sasToken - if created in Azure portal
  const blobService = new BlobServiceClient(
    `https://${storageAccountName}.blob.core.windows.net?${sasToken}`
  );
  console.log(`blobservice: https://${storageAccountName}.blob.core.windows.net/?${sasToken}`);

  // get Container - full public read access
  const containerClient = blobService.getContainerClient(containerName);

  // upload file
  await createBlobInContainer(containerClient, file);

  // // get list of blobs in container
  return getBlobsInContainer(containerClient);
};
 

Я в основном пытаюсь понять, почему это происходит и как это предотвратить/избежать. Код выполняется до тех console.log(`blobservice: https://${storageAccountName}.blob.core.windows.net/?${sasToken}`); пор, пока не будет нарушен из-за ошибки 403 из-за недопустимой подписи.

Комментарии:

1. Это может быть связано с некоторым форматированием URL-адреса

2. @SaGaR да, я предполагаю, что это проблема с тем, как blob-сервис-клиент добавляет ключ SAS в контейнерный клиент или что-то в этом роде, но я не знаю, как решить эту проблему

3. Оказывается, на самом деле firefox делает с ним что-то странное. Я бы хотел, чтобы он мог работать в этом браузере, но, похоже, не хочет. Отлично работает на chrome и edge.

4. Приятно это слышать.

Ответ №1:

Спасибо @SaGaR за предложение, я превращаю это в ответ, который может помочь другим членам сообщества:

Итак, у firefox может быть какой-то сбой, и после проверки того же в браузерах chrome и edge, надеюсь, это сработало для вас.