我尝试将一些HTTP GET调用调用到MS Azure IoT Hub的设备双胞胎。
正如您所看到的,GET调用会导致未经授权的IoTHubUnauthorizedAccess错误代码。
我使用Azure Device Explorer生成了授权标头的令牌,如下图所示。
有人对此有任何想法吗?我已经在这里搜索了,唯一的topic没有帮助我。
答案 0 :(得分:0)
您似乎正在尝试从"设备访问设备双胞胎" (当您使用通过设备ID /密钥对生成的SAS令牌时)使用REST API。 对于"设备"与设备双胞胎的交互无法做到这一点。是通过MQTT完成的,而不是通过HTTP完成的(请参阅下面的链接,了解有关IoT Hub端点和双胞胎的文档)。如果您想从设备使用设备Twins,我建议您查看Azure IOT设备SDK。如果您想了解有关使用MQTT的更多信息,请阅读this。
但是,如果您想从后端角度使用设备Twins(如使用为设备设置所需属性的后端应用程序,读取设备报告的属性并使用标签),则需要使用从一个生成的SAS令牌IoT Hub共享访问策略名称/密钥(不是设备凭据)。尝试使用相同的设备资源管理器工具生成SAS令牌,但是在"配置"选项卡。
有关设备双胞胎的一些文档可以帮助您更清楚地了解这些内容:
答案 1 :(得分:0)
您可以使用Postman Pre-request脚本沙箱生成SAS令牌。这是我写的一篇博文,详细介绍了生成SAS令牌所需的一切。 http://blog.jongallant.com/2017/02/azure-iot-hub-device-twin-rest-apis-postman-newman/
这是一个Postman集合,它将向您展示如何执行API:https://www.getpostman.com/collections/84a38008cd07accf565e
这里有更多Postman / Azure相关帖子(也是我自己的): http://blog.jongallant.com/tags/postman/
这是我在预请求脚本沙箱中使用的代码:
var resourceName = postman.getEnvironmentVariable("resourceName");
var resourceKey = postman.getEnvironmentVariable("resourceKey");
var tokenExpirationPeriod = postman.getEnvironmentVariable("tokenExpirationPeriod");
var policyKeyName = postman.getEnvironmentVariable("policyKeyName");
postman.clearEnvironmentVariable("deviceTwinSasToken"); // clear out token on first run.
// See this doc for details: https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-security
var resourceUri = encodeURIComponent(resourceName + '.azure-devices.net'); // The resource uri
var expiry = Math.ceil((Date.now() / 1000) + tokenExpirationPeriod * 60); // Expire the token 60 minutes from now
var uriExpiry = resourceUri + '\n' + expiry; // this is the string format to gen signature from
var decodedKey = CryptoJS.enc.Base64.parse(resourceKey); // The SHA256 key is the Base64 decoded version of the IoT Hub key
var signature = CryptoJS.HmacSHA256(uriExpiry, decodedKey); // The signature generated from the decodedKey
var encodedUri = encodeURIComponent(CryptoJS.enc.Base64.stringify(signature)); // The url encoded version of the Base64 signature
// Construct authorization string (shared access signature)
var deviceTwinSasToken = "SharedAccessSignature sr=" + resourceUri + "&sig=" + encodedUri + "&se=" + expiry;
// Add token if one is present
if (policyKeyName) {
deviceTwinSasToken += "&skn="+ policyKeyName;
}
// Put in variable to be used in other requests.
postman.setEnvironmentVariable("deviceTwinSasToken", deviceTwinSasToken);
console.log("Shared Access Signature:" + postman.getEnvironmentVariable("deviceTwinSasToken"));
答案 2 :(得分:0)
从your picture开始,您使用了指定的设备SAS令牌。当您需要使用IoT Hub SAS令牌时,它可以授予access control and permissions。您可以使用Device Explorer获取它,如下所示:
在成功发布Get请求后,您将获得设备双胞胎信息,在邮递员中,它看起来像这样: