Node.js 无法将查询授权给Azure表服务

Node.js 无法将查询授权给Azure表服务,node.js,azure-table-storage,Node.js,Azure Table Storage,我正在尝试设置一个API以从Azure表存储获取信息。我一直在关注文档和一个类似的问题,但我一直无法让它正常工作。我收到一个HTTP 403错误,服务器无法验证请求。确保包括签名在内的授权标头的值格式正确。。这是代码。现在,我只是尝试对/Tables资源进行基本的查询,尽管最终我将查询特定的rowid const crypto=requirecrypto; const request=要求'request-promise-native'; const yourStorageAccountName

我正在尝试设置一个API以从Azure表存储获取信息。我一直在关注文档和一个类似的问题,但我一直无法让它正常工作。我收到一个HTTP 403错误,服务器无法验证请求。确保包括签名在内的授权标头的值格式正确。。这是代码。现在,我只是尝试对/Tables资源进行基本的查询,尽管最终我将查询特定的rowid

const crypto=requirecrypto; const request=要求'request-promise-native'; const yourStorageAccountName='XXXXXXXX'; 让CanonicalizedResource=`${yourStorageAccountName}/Tables`; 让url=`https://${yourStorageAccountName}.table.core.windows.net/Tables`; 让我们现在=新的日期; 让nowUTC=now.toutString; 让stringToSign=`GET\n\n\n${nowUTC}\n${CanonicalizedResource}`; 让accesskey=`YYYYYYYY`; let key=new Bufferaccesskey,base64; 设hmac=crypto.createHmacsha256,key; hmac.updatestringToSign; 设sig=hmac.digestbase64; console.logSIGNATURE:+sig; console.lognowutc:+nowUTC; 让标题={ 授权:SharedKey+yourStorageAccountName+:+sig, x-ms-date:nowUTC, 日期:世界时, x-ms-version:2015-12-11 }; var响应=请求{ url:url, 方法:“GET”, 标题:标题 }; console.logresponse;
根据我的测试,我们可以使用以下代码创建共享密钥

const accesskey=""
    const storageAccount = ""
    const resource = "Tables"

    const data =  new Date(Date.UTC(2020, 1, 2, 3, 4, 5));
    const GMTTime = data.toUTCString()
    console.log(GMTTime)

    //Shared Key authorization
    const StringToSign= "GET"+"\n"
                           +"\n"
                           +"\n"
                           + GMTTime +"\n"
                           +"/"+ storageAccount+"/"+resource

    const Sig = crypto.createHmac('sha256', Buffer.from(accesskey, 'base64')).update(StringToSign, 'utf8').digest('base64');
    console.log(Sig)

    //Shared Key Lite authorization
    const stringToSign = GMTTime +"\n"+"/"+ storageAccount+"/"+resource
    const sig = crypto.createHmac('sha256', Buffer.from(accesskey, 'base64')).update(stringToSign, 'utf8').digest('base64');
    console.log(sig)
TestQ 1.共享密钥授权

GET https://myaccount.table.core.windows.net/Tables
Headers
       Authorization : SharedKey <account name>:kHl5K0AzsG7M32***AoxmCFY=
       x-ms-date : <the data you use to create share key>
       Accept : application/json;odata=nometadata
       x-ms-version : 2017-04-17
密码
这起作用了。实际上,我可以使用我的原始示例,但代码中有两个错误导致它失败。1我在CanonicalizedResource中缺少前导斜杠,2接受:application/json;odata=标题中的nometadata行似乎是必需的。一旦我做了这些改变,我的样品也开始工作了。谢谢你的帮助!
GET https://myaccount.table.core.windows.net/Tables
Headers
       Authorization : SharedKeyLite <account name>:0fADhBTi7tvtm***h69Y433c=
       x-ms-date : <the data you use to create share key>
       Accept : application/json;odata=nometadata
       x-ms-version : 2017-04-17
npm install azure-storage
var azure=require('azure-storage')
async function main() {
    const accesskey=""
    const storageAccount = ""
    var tableService=azure.createTableService(storageAccount,accesskey);
    tableService.listTablesSegmented(null,function(error,result){

        if(error){
           console.log(error)

        }else{

            for (var i = 0, table; table = result.entries[i]; i++) {
                console.log(table)
            }

        }

    })
  }

  // An async method returns a Promise object, which is compatible with then().catch() coding style.
  main()
    .then(() => {
      console.log("Successfully executed the sample.");
    })
    .catch((err) => {
      console.log(err.message);
    });