尝试使用 SAS 访问 Azure blob 时收到“签名不匹配。使用的签名字符串是...”

Posted

技术标签:

【中文标题】尝试使用 SAS 访问 Azure blob 时收到“签名不匹配。使用的签名字符串是...”【英文标题】:Receiving "Signature did not match. String to sign used was..." when trying to access Azure blob with SAS 【发布时间】:2021-07-05 16:49:10 【问题描述】:

使用@azure/storage-blob NPM 包为 blob 生成 SAS 令牌,然后将其附加到 blobUrl 的末尾后,我收到以下错误消息:

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>AuthenticationFailed</Code>
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:1ef69362-901e-0040-7d73-2d98d5000000
Time:2021-04-09T19:07:19.0571601Z</Message>
    <AuthenticationErrorDetail>Signature did not match. String to sign used was r

2021-04-09T19:08:30Z
/blob/[process.env.STORAGE_ACCOUNT]/[container]/[blobName]



2020-06-12
b





</AuthenticationErrorDetail>
</Error>

我已经将这些值与sasOptions 中提供的参数进行了比较,它们完全匹配。我的相关Node.js代码如下:

let blobUrl = 
`https://$process.env.STORAGE_ACCOUNT.blob.core.windows.net/$container/$blobName`;

const sasOptions = 
    containerName: containerClient.containerName,
    blobName: blobName,
    expiresOn: new Date(new Date().valueOf() + 86400),
    permissions: BlobSASPermissions.parse('r')
;

const sharedKeyCredential = new StorageSharedKeyCredential(
    process.env.STORAGE_ACCOUNT, 
    process.env.AZURE_STORAGE_CONNECTION_STRING
);

const sasToken = generateBlobSASQueryParameters(sasOptions, sharedKeyCredential).toString();

blobUrl += sasToken;

【问题讨论】:

在查看了我的问题后,我意识到我的问题可能是由使用连接字符串创建sharedKeyCredential 引起的。但是,如果我使用帐户密钥,错误消息会变为:“指定的资源不存在。”。 【参考方案1】:

问题解决了!问题是:

    我确实需要使用帐户密钥而不是连接字符串,并且 将sasToken 附加到blobUrl 时,我需要添加?...facepalm

最终代码如下:

const blockBlobClient = containerClient.getBlockBlobClient(blobName);
await blockBlobClient.upload(data, data.length,  blobHTTPHeaders:  blobContentType: contentType );
let blobUrl = `https://$process.env.STORAGE_ACCOUNT.blob.core.windows.net/$container/$blobName`;

const sasOptions = 
    containerName: containerClient.containerName,
    blobName: blobName,
    expiresOn: new Date(new Date().valueOf() + 86400),
    permissions: BlobSASPermissions.parse('r'),
    protocol: SASProtocol.https
;

const sharedKeyCredential = new StorageSharedKeyCredential(process.env.STORAGE_ACCOUNT, process.env.STORAGE_ACCOUNT_KEY);

const sasToken = generateBlobSASQueryParameters(sasOptions, sharedKeyCredential).toString();

blobUrl += `?$sasToken`;

【讨论】:

以上是关于尝试使用 SAS 访问 Azure blob 时收到“签名不匹配。使用的签名字符串是...”的主要内容,如果未能解决你的问题,请参考以下文章

生成的 Azure Blob 版本 SAS 问题

使用PowerShell创建Azure Storage的SAS Token访问Azure Blob文件

使用 SAS 将文件从 Azure Blob 存储下载到浏览器

Azure 存储帐户:Blob 服务 (SAS) 连接检查失败

Azure Blob 存储 SAS ExpireOn 不起作用

Azure SAS 令牌不适用于 Azure.Storage.Blobs BlobServiceClient