Выполните Azure CosmosDB хранимую процедуру, используя REST API - PullRequest
0 голосов
/ 14 февраля 2020

Я просто пытался выполнить простую хранимую процедуру CosmosDB из функции Node-RED, используя узел HTTP. Но я получаю сообщение об ошибке "{" code ":" Unauthorized "," message ":" Токен авторизации ввода не может обработать запрос. Пожалуйста, проверьте, что ожидаемая полезная нагрузка построена в соответствии с протоколом, и проверьте используемый ключ. Сервер использовал следующую полезную нагрузку для подписи: 'post \ nsprocs \ ndbs / iot_test / colls / testdata / sprocs / hello \ nfri, 14 февраля 2020 06:29:47 gmt \ n \ n' \ r \ nActivityId: 35a03050-7ab7- 400f-a640-77010ecfe3bb, Microsoft. Azure .Documents.Common / 2.9.2 "}"

Может кто-нибудь, пожалуйста, помогите. Я застрял.

Код моей хранимой процедуры

function hello(name) {
     getContext().getResponse().setBody("Hello, "+ name);
}

Функция Node-RED

var crypto = global.get('crypto');
var moment = global.get('moment');
var dateFormat = 'ddd, DD MMM YYYY HH:mm:ss';

function getAuthorizationTokenUsingMasterKey(verb, resourceType, resourceId, date, masterKey) {  
    var key = new Buffer(masterKey, "base64");  

    var text = (verb || "").toLowerCase() + "\n" +   
               (resourceType || "").toLowerCase() + "\n" +   
               (resourceId || "") + "\n" +   
               date.toLowerCase() + "\n" +   
               "" + "\n";  

    var body = new Buffer(text, "utf8");  
    var signature = crypto.createHmac("sha256", key).update(body).digest("base64");  

    var MasterToken = "master";  

    var TokenVersion = "1.0";  

    return encodeURIComponent("type=" + MasterToken + "&ver=" + TokenVersion + "&sig=" + signature);  
}

const verb= 'GET';
const resourceType='docs';
const resourceId='dbs/iot-test/colls/testdata';
const date = moment.utc().format(dateFormat)+" GMT";
const masterKey = 'D9vXtelJ9F6hrKDXP2qlkNgKZzw0XJ6qTtXxmc8Qf7vPkdtdIy5274jaoB5yEkfzHO3sxiRT4KZFbhon5391wQ==';


const databaseaccount = "etcsandpitiotcosmos";
const db_id = "iot_test";
const col_id= "testdata";
const stored_proc = "hello";
msg.dt = date; 
msg.method ='POST';
msg.url = "https://"+ databaseaccount +".documents.azure.com/dbs/"+ db_id +"/colls/"+ col_id +"/sprocs/"+stored_proc+"/";
msg.headers = {};
msg.headers['Content-Type']="application/query+json";
msg.headers['x-ms-version'] = '2018-12-31';
msg.headers['x-ms-date'] = date;
msg.headers['Authorization'] = getAuthorizationTokenUsingMasterKey(verb, resourceType, resourceId, date, masterKey);
msg.payload = ["Monty"];
return msg;
...