通过REST的Azure IoT Hub导致未经授权

时间:2017-03-28 08:47:52

标签: rest azure azure-iot-hub

我尝试将一些HTTP GET调用调用到MS Azure IoT Hub的设备双胞胎。

HTTP GET call via Postman

正如您所看到的,GET调用会导致未经授权的IoTHubUnauthorizedAccess错误代码。

我使用Azure Device Explorer生成了授权标头的令牌,如下图所示。

Generated SAS Token

有人对此有任何想法吗?我已经在这里搜索了,唯一的topic没有帮助我。

3 个答案:

答案 0 :(得分:0)

您似乎正在尝试从"设备访问设备双胞胎" (当您使用通过设备ID /密钥对生成的SAS令牌时)使用REST API。 对于"设备"与设备双胞胎的交互无法做到这一点。是通过MQTT完成的,而不是通过HTTP完成的(请参阅下面的链接,了解有关IoT Hub端点和双胞胎的文档)。如果您想从设备使用设备Twins,我建议您查看Azure IOT设备SDK。如果您想了解有关使用MQTT的更多信息,请阅读this

但是,如果您想从后端角度使用设备Twins(如使用为设备设置所需属性的后端应用程序,读取设备报告的属性并使用标签),则需要使用从一个生成的SAS令牌IoT Hub共享访问策略名称/密钥(不是设备凭据)。尝试使用相同的设备资源管理器工具生成SAS令牌,但是在"配置"选项卡。

有关设备双胞胎的一些文档可以帮助您更清楚地了解这些内容:

Device Twin description

IoT Hub endpoints

答案 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获取它,如下所示:

enter image description here

在成功发布Get请求后,您将获得设备双胞胎信息,在邮递员中,它看起来像这样:

enter image description here