1

按照官方文档,我编写了这个脚本来尝试连接自定义域 azure 存储空间:

const { BlobServiceClient } = require("@azure/storage-blob");

const account = "validaccount";
const sas = "sv=xxxx&.......";

const blobServiceClient = new BlobServiceClient(`https://${account}.blob.core.customdomain.name${sas}`);

//===============

async function main() {
  let i = 1;
  let containers = blobServiceClient.listContainers();
  for await (const container of containers) {
    console.log(`Container ${i++}: ${container.name}`);
  }
}

main();

我收到错误:Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

我确定 SASURI 是有效的,我可以在azure blob storage explorer中使用它,但在我的代码中它不起作用。

我尝试了一些组合,例如:</p>

  1. https://${account}.blob.core.customdomain.name?${sas}//添加一个'?'
  2. https://${account}.blob.core.customdomain.name/abc?${sas} //abc 是一个有效的容器名称
  3. https://${account}.blob.core.customdomain.name/abc${sas}//消除 '?' 但保留容器名称
  4. https://${account}.blob.core.customdomain.name',sas//尝试作为两个参数传递。

但都失败了。

我不确定还有其他方法。

我想这可能是因为 SAS 令牌仅授权给abc容器,它无法读取域根目录。

但如果是这样,为什么第二个组合也失败了。

我使用@azure/storage-blob v12.3.0

4

1 回答 1

2

我找到了正确的答案。

问题的核心是他们给我的SAS Token,已经绑定到名为“abc”的容器上。

SAS 令牌不是对域下所有内容的授权,令牌仅授权我访问容器“abc”。

因此,当我创建 BlobServiceClient 对象时,“位置”(如果我可以这么说的话)已经在容器“abc”下。由于我已经在一个容器中,我不能list container再这样做了。

当我更改完整路径并尝试连接根时,实际上不允许使用令牌。当然授权失败了。

得出结论:

SAS 令牌已经绑定到特定容器“abc”,因此我既不能列出容器,也不能访问域的根路径。

我只能列出特定容器中 blob 的数据。

blob-storage 包的错误信息不是很清楚。

这里不是代码

const { BlobServiceClient } = require("@azure/storage-blob");
const account = "validaccount";
const sas = "sv=xxxx&.......";
const blobServiceClient = new BlobServiceClient(`https://${account}.blob.core.customdomain.name/abc?${SAS}`);

////====== just change 'list container' code to 'list blobs' code

const containerName = ""; //empty string, since you already in the container.

async function main() {
  const containerClient = blobServiceClient.getContainerClient(containerName);
  let i = 1;
  let blobs = containerClient.listBlobsFlat();
  for await (const blob of blobs) {
    console.log(`Blob ${i++}: ${blob.name}`);
  }
}

main();
于 2021-01-09T16:42:36.700 回答