在NodeJS代码中使用SharedKeyLite更新Azure表存储中的数据时,出现验证错误

时间:2019-03-13 06:41:24

标签: node.js azure-table-storage

我正在尝试在我的nodejs代码中使用Rest API和SharedKeyLite更新Azure Table存储,但收到身份验证错误- “服务器无法验证请求。请确保 授权标头的格式正确,包括签名。“

请在下面找到我的nodejs代码-

const Request = require('request');
const CryptoJS = require('crypto-js');

let apiVersion = '2018-03-28';
let contentType = 'application/json';
let dataServiceVersion = '3.0;NetFx';
let maxDataServiceVersion = '3.0;NetFx';
let storageAccountName = "mybotstorage";
let tableName = "myBotCounter";
let key = "**********************YO+MnTwBBbKKcPfsFQwg==";

var strTime = (new Date()).toUTCString();
let strToSign = strTime + '\n/' + storageAccountName + '/' + tableName + '(PartitionKey=\'mypartkey\',RowKey=\'myrowkey\')';
var secret = CryptoJS.enc.Base64.parse(key);
var hash = CryptoJS.HmacSHA256(strToSign, secret);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
var auth = "SharedKeyLite mybotstorage:" + hashInBase64;

var postData = {
    "counter": "1050"
}

let content = Buffer.from(JSON.stringify(postData));
let contentLength = content.byteLength;

let headers = {};
headers['Authorization'] = auth;
headers['x-ms-date'] = strTime;
headers['x-ms-version'] = apiVersion;
headers['DataServiceVersion'] = dataServiceVersion;
headers['MaxDataServiceVersion'] = maxDataServiceVersion;
headers['Content-Type'] = contentType;
headers["Content-Length"] = contentLength;
headers["Accept-Charset"] = "UTF-8";
headers["Accept"] = "application/json";

let url = "https://mybotstorage.table.core.windows.net/" + tableName + "(PartitionKey='mypartky',RowKey='myrowkey')";
var options = {
    headers: headers,
    method: 'PUT',
    body: content,
    url: url
}
Request(options, function (err, res, body) {
    if (err) {
        console.error('error posting json: ', err)
        throw err
    }
    var headers = res.headers;
    var statusCode = res.statusCode;
    console.log('headers: ', headers);
    console.log('statusCode: ', statusCode);
    console.log('body: ', body);
});

注意:使用nodejs使用'GET'检索数据并使用'POST'插入数据可以很好地工作,只有我无法使用nodejs中的'PUT'方法更新数据。

我还使用C#代码测试了“ PUT”方法,它可以正常工作,但nodejs代码却给出了身份验证错误。

1 个答案:

答案 0 :(得分:0)

此问题是由于C#和NodeJS对url的编码方式不同而引起的。 我正在发布工作代码示例以供参考。

const Request = require('request');
const CryptoJS = require('crypto-js');

let apiVersion = '2013-08-15';
let contentType = 'application/json';
let storageAccountName = "mybotstorage";
let tableName = "myBotCounter";
let key = "*******************************YO+MnTwBBbKKcPfsFQwg==";

let strTime = (new Date()).toUTCString();
let strToSign = strTime + '\n/' + storageAccountName + '/' + tableName + '(PartitionKey=%27mypartitionkey%27,RowKey=%27myrowkey%27)';
let secret = CryptoJS.enc.Base64.parse(key);
let hash = CryptoJS.HmacSHA256(strToSign, secret);
let hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
let auth = "SharedKeyLite mybotstorage:" + hashInBase64;
console.log(strToSign);
console.log(auth);

let postData = {
    "counter": "1088"
}
let headers = {};
headers['Content-Type'] = contentType;
headers['Authorization'] = auth;
headers['x-ms-date'] = strTime;
headers['x-ms-version'] = apiVersion;

let url = "https://mybotstorage.table.core.windows.net/" + tableName + "(PartitionKey=%27mypartitionkey%27,RowKey=%27myrowkey%27)";
console.log('url------', url);
var options = {
    headers: headers,
    method: 'PUT',
    body: JSON.stringify(postData),
    url: url
}
Request(options, function (err, res, body) {
    if (err) {
        console.error('error posting json: ', err)
        throw err
    }
    var headers = res.headers;
    var statusCode = res.statusCode;
    console.log('headers: ', headers);
    console.log('statusCode: ', statusCode);
    console.log('body: ', body);
});