我正在尝试使用 Postman 向 Azure 表 REST API 发出 GET 请求。 我可以使用我找到的 C# 程序发出工作请求,但是当我尝试将相同的信息复制到 Postman 请求中时,它会返回以下错误:
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)的信息。 当我将它们传递给 postman 时,它仍然会给我一个错误。 每当我创建新的授权字符串时,我都会更新 postman 中的日期。
我的 postman 设置如下:
我最终想用 ESP32 发出这个请求,所以它可能有点无关,但 ESP 给了我同样的错误。任何有关为 Postman 或 ESP 设置正确 header 的提示都值得赞赏。
最佳答案
要使此工作正常进行,首先在您的环境中创建两个变量:
{{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
最后,定义一个预请求脚本:
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是因为您需要一个占位符来存储计算的 token ,utcDate是因为必须使用 header 中的相同日期来计算 token 。
关于azure - 如何使用 Postman 将查询发送到 Azure 表 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657838/