Azure:使用Azure REST API的表acl GET在按文档完成时不起作用

时间:2018-05-17 18:09:53

标签: node.js azure azure-storage

我正在关注GET ACL TableAuthentication 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标头。我可能会遗漏一些东西,但我无法确定它可能是什么。

如果我在这种情况下捏什么,你能告诉我吗?

1 个答案:

答案 0 :(得分:0)

基本上问题是你正确地生成了规范化的资源字符串。

文档说明如下:

  

2009-09-19及更高版本的共享密钥精简版和表格服务格式

     

此格式支持所有版本的共享密钥和共享密钥精简版   表服务和版本2009-09-19和的共享密钥精简版   稍后的Blob和队列服务以及版本2014-02-14及更高版本   文件服务。此格式与使用的格式相同   以前版本的存储服务。构建   CanonicalizedResource字符串的格式如下:

     
      
  1. 以空字符串(“”)开头,附加正斜杠(/),后跟拥有该资源的帐户的名称   访问。
  2.   
  3. 附加资源的编码URI路径。如果请求URI指向资源的组件,请附加相应的查询   串。查询字符串应包含问号和comp   参数(例如,?comp = metadata)。不应该有其他参数   包含在查询字符串中。
  4.   

基于此,您的stringToSign应为:

let stringToSign = `GET\n\n\n${nowUTC}\n/${yourStorageAccountName}/tablename?comp=acl`;

试一试,它应该有用。