Node.js 自定义域时无法使用 SAS 令牌连接 azure-blob
Node.js failed to connect azure-blob using SAS token when domain is customized
在 official doc 之后,我编写了这个脚本来尝试连接自定义域 azure 存储 space:
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 中使用它,但在我的代码中它不起作用。
我尝试了一些组合,例如:
https://${account}.blob.core.customdomain.name?${sas}
//添加一个'?'
https://${account}.blob.core.customdomain.name/abc?${sas}
//abc 是一个有效的容器名称
https://${account}.blob.core.customdomain.name/abc${sas}
//去掉'?'但保留容器名称
https://${account}.blob.core.customdomain.name',sas
//尝试作为两个参数传递。
但都失败了。
我不确定是否还有其他方法。
我猜可能是因为 SAS 令牌只授权给 abc
容器,它无法读取域根。
但如果是这样,为什么第二个组合也失败了。
我用的是@azure/storage-blob v12.3.0
我找到了正确答案。
问题的核心是他们给我的SAS Token,已经绑定到名为“abc”的容器上了。
SAS Token 并不是对域下所有内容的授权,token 只授权我访问容器“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();
在 official doc 之后,我编写了这个脚本来尝试连接自定义域 azure 存储 space:
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 中使用它,但在我的代码中它不起作用。
我尝试了一些组合,例如:
https://${account}.blob.core.customdomain.name?${sas}
//添加一个'?'https://${account}.blob.core.customdomain.name/abc?${sas}
//abc 是一个有效的容器名称https://${account}.blob.core.customdomain.name/abc${sas}
//去掉'?'但保留容器名称https://${account}.blob.core.customdomain.name',sas
//尝试作为两个参数传递。
但都失败了。
我不确定是否还有其他方法。
我猜可能是因为 SAS 令牌只授权给 abc
容器,它无法读取域根。
但如果是这样,为什么第二个组合也失败了。
我用的是@azure/storage-blob v12.3.0
我找到了正确答案。
问题的核心是他们给我的SAS Token,已经绑定到名为“abc”的容器上了。
SAS Token 并不是对域下所有内容的授权,token 只授权我访问容器“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();