0

我正在使用此代码生成我的令牌。我刚刚更改了用于生成令牌的示例代码,也将日期返回给我,因为我必须在请求中发送它。

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"
}

据我从文档中得知,有效载荷根据预期的协议构建的。

执行存储过程公共请求标头访问控制。该请求是使用邮递员发送的,我将脚本生成的值直接复制到其中。我究竟做错了什么?

4

1 回答 1

0

Azure Cosmos DB 有两种类型的“密钥”。

主密钥- 用于管理资源:数据库帐户、数据库、用户和权限 资源令牌- 用于应用程序资源:容器、文档、附件、存储过程、触发器和 UDF

保护对 Azure Cosmos DB 数据的访问

您提供的示例与文档中的示例不匹配,例如:使用主密钥的代码示例

至于使用令牌:

当您想要向无法使用主密钥信任的客户端提供对 Cosmos DB 帐户中资源的访问权限时,可以使用资源令牌(通过创建 Cosmos DB 用户和权限)。

而且我没有看到var TokenVersion = "1.0"需要与主令牌等一起使用的以下内容。

于 2018-10-08T20:16:09.500 回答