Как сгенерировать SAS делегирования пользователей для службы хранилища Azure с помощью Javascript SDK

Я пытаюсь отправить файл в хранилище BLOB-объектов Azure. Что я сделал до сих пор:

npm i @azure/identity @azure/storage-blob

Сгенерируйте параметры запроса SAS с ключом делегирования пользователя:

async function generateSas() {
    const startDate = new Date();
    const expiryDate = new Date();
    startDate.setTime(startDate.getTime() - 100 * 60 * 1000);
    expiryDate.setTime(expiryDate.getTime() + 100 * 60 * 60 * 1000);

    const credential = new DefaultAzureCredential();
    const blobServiceClient = new BlobServiceClient(STORAGE, credential);
    const key = await blobServiceClient.getUserDelegationKey(startDate, expiryDate);

    return generateBlobSASQueryParameters({
        containerName: CONTAINER,
        startsOn: startDate,
        expiresOn : expiryDate,
        permissions: ContainerSASPermissions.parse('rwl'),
    }, key, ACCOUNT).toString();
}

Используйте сгенерированный SAS для загрузки

async function upload(sasToken: string) {
    const blobClient = new BlockBlobClient(
      `https://${ACCOUNT}.blob.core.windows.net/${CONTAINER}/test.json?${sasToken}`);
    const content = 'some content';
    const response = await blobClient.upload(content, content.length);
}

Прежде чем запустить это, я делаю az login со своей учетной записью.

Ошибка:

(node:19584) UnhandledPromiseRejectionWarning: RestError: This request is not authorized to perform 
this operation using this permission. 

Если я скопирую SAS из Azure Storage Explorer с тем же именем входа, код заработает! Поэтому я предполагаю, что есть способ получить действующий SAS для моей учетной записи.


person hansmaad    schedule 20.01.2021    source источник


Ответы (1)


Я подозреваю, что это проблема с разрешением.

После анализа Невозможно перечислить файловую систему Azure DataLake с помощью javascript и ManagedIdentityCredential не удалось при использовании для вывода списка контейнеров больших двоичных объектов # 5539, я думаю, что роли Owner недостаточно для загрузки больших двоичных объектов в вашу учетную запись хранения больших двоичных объектов. Вам нужно будет использовать одну из Storage Blob Data * ролей (например, Storage Blob Data Owner, прежде чем вы сможете загружать большие двоичные объекты.

Итак, попробуйте добавить роль Storage Blob Data Owner своему предполагаемому пользователю и попробуйте запустить код еще раз.

person singhh-msft    schedule 20.01.2021
comment
Но почему я могу отправлять данные с помощью обозревателя хранилищ Azure. Проводник использует тот же логин, что и моя маленькая программа. Может быть, токен доступа от DefaultAzureCredential и az login чего-то не хватает ...? - person hansmaad; 20.01.2021
comment
У вас есть это разрешение? Ознакомьтесь с этим документом MS: docs.microsoft.com/en-us/azure/storage/blobs/. Кроме того, проверьте, устанавливаете ли вы разрешения типа SetPermissions в коде js: docs.microsoft.com/en-us/azure/storage/blobs/ - person singhh-msft; 20.01.2021
comment
Сработало ли после этого исправления? - person singhh-msft; 21.01.2021
comment
Нет. Но я не менял никаких ролей, потому что в этом весь смысл вопроса: я НЕ ХОЧУ менять роли. И должен быть способ, потому что он работает в Storage Explorer. Обозреватель хранилищ Azure знает, как создать SAS для моего пользователя, не требуя для него каких-либо специальных ролей. Но спасибо, что снова спросили;) - person hansmaad; 21.01.2021
comment
Можете ли вы попробовать использовать для этого Https: docs.microsoft.com/en-us/rest/api/storageservices/? - person singhh-msft; 29.01.2021