我正在关注GET ACL Table,Authentication for the Azure Storage Services的Azure REST文档。
以下是我正在执行的REST操作的代码段。
//Input your Storage Account and access-key associated to it.
const yourStorageAccountName = '';
const accessKeyStorageAccount = '';
const Client = require('node-rest-client').Client;
const crypto = require("crypto");
async function getTableAcl() {
let now = new Date();
let nowUTC = now.toUTCString();
let contentType = "application/json"
// construct input value
let stringToSign = `GET\n\n\n${nowUTC}\n/${yourStorageAccountName}/tablename\ncomp:acl`;
let accesskey = accessKeyStorageAccount;
// create base64 encoded signature
let key = new Buffer(accesskey, "base64");
let hmac = crypto.createHmac("sha256", key);
hmac.update(stringToSign);
let sig = hmac.digest("base64");
console.log("SIGNATURE : " + sig);
console.log("nowutc : " + nowUTC);
let args = {
headers: {
"Authorization": "SharedKey " + yourStorageAccountName + ":" + sig,
"Date": nowUTC,
"x-ms-version": "2015-12-11"
}
};
let restClient = new Client();
restClient.get(`https://${yourStorageAccountName}.table.core.windows.net/tablename?comp=acl`, args, function (data, response) {
console.log(JSON.stringify(data));
//console.log(response);
});
}
getTableAcl()
这里的问题是Azure Table ACL documentation中没有提及Content-Type,但在Authorization标题部分中,它包含Content-Type。因此,我在" stringToSign"中保持内容类型为空。并且我没有在REST调用中提供Content-Type标头。我可能会遗漏一些东西,但我无法确定它可能是什么。
如果我在这种情况下捏什么,你能告诉我吗?
答案 0 :(得分:0)
基本上问题是你正确地生成了规范化的资源字符串。
文档说明如下:
2009-09-19及更高版本的共享密钥精简版和表格服务格式
此格式支持所有版本的共享密钥和共享密钥精简版 表服务和版本2009-09-19和的共享密钥精简版 稍后的Blob和队列服务以及版本2014-02-14及更高版本 文件服务。此格式与使用的格式相同 以前版本的存储服务。构建 CanonicalizedResource字符串的格式如下:
- 以空字符串(“”)开头,附加正斜杠(/),后跟拥有该资源的帐户的名称 访问。
- 附加资源的编码URI路径。如果请求URI指向资源的组件,请附加相应的查询 串。查询字符串应包含问号和comp 参数(例如,?comp = metadata)。不应该有其他参数 包含在查询字符串中。
醇>
基于此,您的stringToSign
应为:
let stringToSign = `GET\n\n\n${nowUTC}\n/${yourStorageAccountName}/tablename?comp=acl`;
试一试,它应该有用。