如何使用SharedKey认证Azurite的Blob存储REST API操作
核心原理
SharedKey授权需要构造签名字符串,用存储账户密钥做HMAC-SHA256加密后Base64编码,最终Authorization头格式为:SharedKey <存储账户名>:<加密编码后的签名>
签名字符串的拼接规则(Blob服务):
<HTTP方法>\n <Content-MD5>\n <Content-Type>\n <请求日期(RFC1123格式)>\n <资源路径(包含容器和Blob,需URL编码)>
Postman自动生成Authorization头步骤
设置请求基本信息
- PUT请求:URL填
http://127.0.0.1:10000/<存储账户名>/<容器名>/<Blob名>(Azurite Blob默认端口10000) - GET请求:URL填
http://127.0.0.1:10000/<存储账户名>/<容器名>/<Blob名>
- PUT请求:URL填
添加预请求脚本
在Postman的「Pre-request Script」标签里粘贴以下代码,替换<你的存储账户名>和<你的存储账户密钥>:// 替换成你的Azurite存储账户名和密钥 const accountName = "<你的存储账户名>"; const accountKey = "<你的存储账户密钥>"; // 获取请求方法、URL、Headers const method = pm.request.method.toUpperCase(); const url = new URL(pm.request.url.toString()); const resourcePath = url.pathname; // 构造签名字符串 const date = new Date().toUTCString(); // RFC1123格式日期 const contentMd5 = pm.request.headers.get("Content-MD5") || ""; const contentType = pm.request.headers.get("Content-Type") || ""; const stringToSign = `${method}\n${contentMd5}\n${contentType}\n${date}\n${resourcePath}`; // 计算HMAC-SHA256并Base64编码 const key = Buffer.from(accountKey, "base64"); const hmac = require("crypto").createHmac("sha256", key); const signature = hmac.update(stringToSign).digest("base64"); // 设置Authorization头和Date头 pm.request.headers.add({ key: "Authorization", value: `SharedKey ${accountName}:${signature}` }); pm.request.headers.add({ key: "Date", value: date });设置其他必要Headers(PUT请求额外需要)
- 上传Blob时,添加
Content-Type头(比如application/octet-stream,文本文件可设text/plain) - 可选:若需验证内容完整性,添加
Content-MD5头(Blob内容的MD5值Base64编码)
- 上传Blob时,添加
发送请求
直接点击发送即可,脚本会自动生成符合要求的Authorization和Date头。
手动计算验证(可选)
如果想手动生成签名,步骤如下:
- 构造签名字符串:比如PUT请求,假设日期为
Wed, 15 Nov 2023 12:00:00 GMT,资源路径是/myaccount/mycontainer/myblob.txt,Content-Type为text/plain,Content-MD5为空,字符串为:PUT\n \n text/plain\n Wed, 15 Nov 2023 12:00:00 GMT\n /myaccount/mycontainer/myblob.txt - 用存储账户密钥(Base64解码后的字节)对上述字符串做HMAC-SHA256加密,再将结果Base64编码
- 构造Authorization头:
SharedKey myaccount:<编码后的签名>
注意事项
- Azurite的存储账户密钥为Base64格式,无需额外转换,直接按脚本逻辑处理即可
- 请求日期必须是UTC的RFC1123格式,且Authorization头中的日期要和Date头完全一致
- 资源路径必须包含存储账户名后的完整路径,比如
/myaccount/mycontainer/myblob,不能省略存储账户名
内容的提问来源于stack exchange,提问作者entropy283
相关产品推荐
相关产品推荐

