gpt4 book ai didi

javascript - 使用 Blob 特定的 SAS token 连接和更新 Azure Blob

转载 作者:行者123 更新时间:2023-12-04 07:26:29 24 4
gpt4 key购买 nike

我想做的事情:我有一个客户端(浏览器,而不是node.js)JS应用程序,它使用@azure/storage-blob包将文件上传到Blob存储。为此,它从特定 Blob 的 Azure 函数获取 SAS token 。该函数会根据每个请求创建 Blob,并将 SAS token 返回给客户端。 Blob 和 SAS 生成工作正常,当在浏览器中打开包含 SAS 的 Blob Url 时,我可以下载它。

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

可以为整个存储帐户创建只读 SAS token ,以使连接启动并运行。但是 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 token :?sv=2018-03-28&sr=b&sig=somesecret&se=2021-07-04T15%3A14%3A28Z&sp=racwl

CORS 方法,尽管我可以确认它在使用全局 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(服务器无法对请求进行身份验证。请确保 Authorization header 的值格式正确,包括签名。)

使用以下服务 URL 时,在 setCors/getProperties 方法中:https://${storageName}.blob.core.windows.net/${containerName}/${fileName}${sasToken} => RestError:资源不支持指定的 Http Verb。

使用仅具有 READ 权限的存储帐户 SAS 时,访问 blob (blob.exists()) 时:403(此请求无权使用此资源类型执行此操作。) (有道理,但我想使用 Blob 特定的 SAS)

最佳答案

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

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

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

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

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

关于javascript - 使用 Blob 特定的 SAS token 连接和更新 Azure Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68192090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com