如何使用 Postman 向 Azure Table REST API 发送查询

How to send a query to Azure Table REST API with Postman

我正在尝试使用 Postman 向 Azure Table REST API 发出 GET 请求。 我可以使用我找到的 C# 程序发出工作请求,但是当我尝试将相同的信息复制到 Postman 请求时 return 出现以下错误:

Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

使用 C# 程序生成我的 UTC 时间和我的授权码。 该程序将给我以下输出:

x-ms-date: Fri, 01 Nov 2019 10:13:26 GMT

Authorization: SharedKeyLite username:e4IREMOVEDSOMELETTERST4Ag=

Request URI: https://username.table.core.windows.net/MainTable(PartitionKey='akey',RowKey='130')

生成的输出在 C# 程序中有效,因为当我使用时:

    result = await Client.GetAsync(requestUri);

结果会给我(akey, 130)的信息。 当我将它们传递给邮递员时,它仍然会给我一个错误。 每当我创建新的授权字符串时,我都会更新邮递员中的日期。

我的邮递员设置如下:

我最终想用 ESP32 发出这个请求,所以它可能有点不相关,但 ESP 给了我同样的错误。任何有关为 Postman 或 ESP 正确设置 headers 的提示都将受到赞赏。

要使这项工作首先在您的环境中创建两个变量:

{{utcDate}}
{{authToken}}

然后创建一个新的 Get 请求并像这样设置您的 header:

x-ms-version             2015-12-11

x-ms-date                {{utcDate}}

Authorization            SharedKey resourceName:{{authToken}}

DataServiceVersion       3.0;NetFx

MaxDataServiceVersion    3.0;NetFx

Accept                   application/json;odata=nometadata

最后,定义一个Pre-request脚本:

var now = new Date().toUTCString();
pm.environment.set("utcDate", now);
var hcar = "/resourceName/TableName";
var verb = request.method;
var cntMd5 = "";
var cntType = "";
var mKey="<Your service key goes here>";

var text = verb + "\n" + (cntMd5 || "") + "\n" + (cntType || "") + "\n" + now + "\n" + hcar;

var key = CryptoJS.enc.Base64.parse(mKey);
var signature = CryptoJS.HmacSHA256(text, key);
var base64Bits = CryptoJS.enc.Base64.stringify(signature);
pm.environment.set("authToken", base64Bits);

变量的原因是,authToken 因为您需要一个占位符来存储计算出的令牌,utcDate 因为必须使用 header 中的相同日期来计算您的令牌。

我发现问题出在 Postman 本身。 自动 URL 编码正在进行 issue。 当我直接转到 MainTable 时,Mauricio 的代码起作用了。