问题
我已经将一组图像(blob)上传到了私有的Azure Blob存储账户,但是当我尝试访问它们时,遇到了以下错误。
GET https://<account-name>.blob.core.windows.net/<container-name>/<blob-name> 403 (Server failed
to authenticate the request. Make sure the value of Authorization header is formed correctly
including the signature.)
由于这是通过Django应用程序在服务器端完成的,因此我没有任何上传数据的问题。 我希望能够使用客户端JavaScript成功检索已上传的blob数据。
背景
我已经仔细阅读并实施了Microsoft Azure文档中有关通过使用共享密钥授权访问我的私有帐户的步骤。 这包括从构造我的签名字符串到使用HMAC SHA-256算法对该数据进行哈希处理的所有内容,如上述链接所述。
除了尝试调用Get Blob API端点的基于Vue的客户端接口以外,我将所有内容都运行在Docker容器上,如下所示。
最小可复现示例
引发此错误的代码如下:
// Add imports
const crypto = require('crypto');
const axios = require('axios');
// Set Azure blob storage data
const account = "<azure-blob-storage-private-account-name>"
const version = "2020-04-08"
const blob = "<blob-name>"
const container = "<container-name>"
const blob_uri = `https://${account}.blob.core.windows.net/${container}/${blob}`;
const today = new Date().toGMTString();
// Construct signature string
const CanonicalisedHeaders = `x-ms-date:${today}\nx-ms-version:${version}\n`;
const CanonicalisedResource = `/${account}/${container}/${blob}`;
const StringToSign = `GET\n\n\n\n\n\n\n\n\n\n\n\n` + CanonicalisedHeaders + CanonicalisedResource;
// Hash string using HMAC Sha-256 and encode to base64
const key = "<shared-access-key-in-base64>";
const utf8encoded = Buffer.from(key, 'base64').toString('utf8');
const signature = crypto.createHmac('sha256', utf8encoded).update(StringToSign).digest("base64");
// Construct the headers and invoke the API call
const blob_config = {
headers: {
"Authorization": `SharedKey ${account}:${signature}`,
"x-ms-date": today,
"x-ms-version": version
}
}
await axios.get(blob_uri, blob_config)
.then((data) => console.log(data))
.catch((error) => console.log(error.message));
我尝试过的
我已经尝试了以下方法,但没有帮助我解决手头的问题。
- 更新CORS设置以避免出现与CORS相关的403禁止访问问题。
- 重新生成我的密钥和连接字符串。
- 检查我的本地机器和Docker容器上的DateTime设置,确保它们处于正确的GMT时间。
- 检查我的签名字符串的组成部分(规范化的标题、资源等)是否按照此处定义的规则构建。这里。
- 阅读类似的StackOverflow和Azure论坛帖子,寻找解决方案。
key
来指代“存储账户密钥”,你可以按照这里的说明访问它:https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage?tabs=azure-portal。在这种情况下,任何一个你的存储账户密钥都应该可以使用。希望这能帮到你 :) - Valentin Stoykov