我正在使用此代码生成令牌。我只是更改了令牌生成的示例代码,也将日期返回给了我,因为我必须在请求中发送日期。
var crypto = require("crypto");
var inputKey = "my-key-from-azure"; // Have tried both primary and secondary master keys from cosmos db
var today = new Date().toUTCString();
console.log(today);
console.log(getAuthorizationTokenUsingMasterKey("POST", "dbs", "dbs/ToDoList", today, inputKey))
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);
}
这是请求标头。对于x-ms-date,我的数据库是在此之后(最新版本)创建的,因此我假定它使用的是该版本;我可以以某种方式验证这一点吗?
{
Authorization: [my-auth-string],
x-ms-version: "2017-02-22",
x-ms-date: "Fri, 05 Oct 2018 19:06:17 GMT",
Content-Type: application/json
}
但是我又收到一条错误消息,抱怨我的令牌的有效性。
{
"code": "Unauthorized",
"message": "The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'post\nsprocs\ndbs/metrics/colls/LoungeVisits/sprocs/calculateAverage\nfri, 05 oct 2018 19:06:17 gmt\n\n'\r\nActivityId: 41cd36af-ad0e-40c3-84c8-761ebd14bf6d, Microsoft.Azure.Documents.Common/2.1.0.0"
}
有效载荷 是根据预期的协议构建的,据我从文档中得知。
Execute a stored procedure,Common Request Headers,Access Control。该请求是使用邮递员发送的,我将脚本生成的值直接复制到其中。我在做什么错了?
答案 0 :(得分:0)
Azure Cosmos DB有两种类型的“键”。
Master keys-用于管理资源:数据库帐户,数据库,用户和权限 Resource tokens-用于应用程序资源:容器,文档,附件,存储过程,触发器和UDF
Securing access to Azure Cosmos DB data
您提供的示例与文档中的示例不匹配,例如:Code sample to use a master key
关于使用令牌:
当您想向无法由主密钥信任的客户端提供对Cosmos DB帐户中资源的访问时,可以使用资源令牌(通过创建Cosmos DB用户和权限)。
我看不到以下var TokenVersion = "1.0"
需要与主令牌等一起使用。