如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS
Posted
技术标签:
【中文标题】如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS【英文标题】:How to generate user delegation SAS for Azure Storage using Javascript SDK 【发布时间】:2021-04-24 13:15:42 【问题描述】:我正在尝试将文件上传到 Azure Blob 存储。到目前为止我做了什么:
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.
如果我使用相同的登录名从 Azure 存储资源管理器 复制 SAS,则代码有效!所以我假设有某种方法可以为我的帐户检索有效的 SAS。
【问题讨论】:
【参考方案1】:我怀疑这是权限问题。
在仔细分析Can't list file system of azure datalake with javascript 和ManagedIdentityCredential failed when used to list blob containers #5539 问题后,我认为Owner
角色不足以在您的blob 存储帐户中上传blob。您必须先使用Storage Blob Data *
角色之一(例如Storage Blob Data Owner
,然后才能上传 Blob。
因此,请尝试将Storage Blob Data Owner
角色添加到您的预期用户并尝试再次运行代码。
【讨论】:
但是为什么我可以使用 Azure 存储资源管理器上传。 Explorer 使用与我的小程序相同的登录名。可能来自DefaultAzureCredential
和az login
的access_token 缺少某些东西...?
您是否已分配此权限?查看此 MS 文档:docs.microsoft.com/en-us/azure/storage/blobs/…。另外,检查您是否在 js 代码中设置了类似 SetPermissions
的权限:docs.microsoft.com/en-us/azure/storage/blobs/…
没有。但我没有改变任何角色,因为这就是问题的全部动机:我不想改变角色。而且必须有一种方法,因为它可以在存储资源管理器中使用。 Azure 存储资源管理器知道如何为我的用户生成 SAS,而不需要任何特殊角色。但是感谢您再次询问;)
你可以尝试使用 Https 吗:docs.microsoft.com/en-us/rest/api/storageservices/…?
根据文档,Owner
角色是不够的:docs.microsoft.com/en-us/rest/api/storageservices/… 以下角色应该起作用:贡献者、存储帐户贡献者、存储 Blob 数据贡献者、存储 Blob 数据所有者、存储 Blob 数据读取者和存储 Blob 委派者。从 Azure 存储资源管理器复制的 SAS 使用帐户密钥进行保护,它与用户委托 SAS 不同。 docs.microsoft.com/en-us/azure/storage/common/…以上是关于如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS的主要内容,如果未能解决你的问题,请参考以下文章
使用javascript sdk将文件上传到Google云端硬盘
如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数
如何在 lambda 函数中包含 javascript aws-sdk?