微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Blob 特定的 SAS 令牌连接和更新 Azure Blob

如何解决使用 Blob 特定的 SAS 令牌连接和更新 Azure Blob

我想要做什么:我有一个客户端(浏览器,而不是 node.js)JS 应用程序,它使用 @azure/storage-blob 包将文件上传到 Blob 存储。为此,它从特定 Blob 的 Azure 函数获取 SAS 令牌。该 Blob 由函数在每个请求上创建,并向客户端返回一个 SAS 令牌。 Blob 和 SAS 生成有效,当在浏览器中打开带有 SAS 的 Blob Url 时,我可以下载它。

现在,当我尝试将 BLOB SAS(不是存储帐户 SAS 或连接字符串)连接到存储帐户时,不起作用。下面的代码在与整个存储帐户中的 SAS 一起使用时有效,但我不想授予那么多权限。如果无法通过 Blob 服务客户端连接到特定 Blob,我不明白为什么可以为特定 Blob 创建 SAS 令牌。

可以为整个存储帐户创建只读 SAS 令牌以启动和运行连接。但是之后 Blob SAS 会去哪里,以便可以访问 Blob?

我似乎错过了一些基本的东西,那么如何才能做到这一点?

const url = `https://${storageName}.blob.core.windows.net/${sasToken}`; // sas for blob from the azure function
// const url = `https://${storageName}.blob.core.windows.net${containerSas}`; // sas from container
// const url = `https://${storageName}.blob.core.windows.net/${containerName}/${fileName}${sasToken}`; // does not work either
const blobService = new BlobServiceClient(url);

await this.setCors(blobService);

// get Container
const containerClient: ContainerClient = blobService.getContainerClient(containerName);

// get client
const blobClient = containerClient.getBlockBlobClient(fileName);

const exists = await blobClient.exists();
console.log('Exists',exists);

// set mimetype as determined from browser with file upload control
const options: BlockBlobParallelUploadOptions = { blobHTTPHeaders: { blobContentType: file.type } };

// upload file
await blobClient.uploadbrowserData(file,options);

编辑:

Blob 的 SAS 令牌: ?sv=2018-03-28&sr=b&sig=somesecret&se=2021-07-04T15%3A14%3A28Z&sp=racwl

CORS 方法,虽然我可以确认它在我使用 global storageaccount SAS 时有效:

private async setCors(blobService: BlobServiceClient): Promise<void> {
  var props = await blobService.getProperties();
  props.
    cors =
    [{
      allowedOrigins: '*',allowedMethods: '*',allowedHeaders: '*',exposedHeaders: '*',maxAgeInSeconds: 3600
    }]
    ;
}

错误

使用 Blob SAS 时,在 setCors/getProperties 方法中:403 (Server Failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.)

当使用以下服务 url 时,在 setCors/getProperties 方法https://${storageName}.blob.core.windows.net/${containerName}/${fileName}${sasToken} => RestError: The resource doesn't support specified Http Verb.

当使用仅具有 READ 权限的存储帐户 SAS 时,访问 blob (blob.exists()) 时:403 (This request is not authorized to perform this operation using this resource type.)(有道理,但我想使用 Blob 特定的 SAS)>

解决方法

您遇到此错误的原因是您尝试使用为 blob 创建的 SAS 令牌(即 Service SAS)设置 CORS。 CORS 操作是服务级别操作,为此您需要使用在帐户级别获取的 SAS 令牌。换句话说,您将需要使用 Account SAS。为 blob 容器或 blob 创建的任何 SAS 令牌都是 Service SAS 令牌。

话虽如此,您确实不需要在每个请求中为存储帐户设置 CORS 属性。这是您可以在创建帐户时执行的操作。

从代码中删除对 setCors 方法的调用后,它应该可以正常工作。

考虑到您只使用 Blob SAS,您可以通过直接使用 SAS URL 创建 BlockBlobClient 的实例来大大简化您的代码。例如,您的代码可以很简单:

const url = `https://${storageName}.blob.core.windows.net/${containerName}/${fileName}${sasToken}`;
const blobClient = new BlockBlobClient(url);
//...do operations on blob using this blob client

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。