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

Azure IoT Hub via REST results in Unauthorized

我尝试对 MS Azure IoT 中心的设备孪生进行一些 HTTP GET 调用。

HTTP GET call via Postman

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

我使用 Azure 设备资源管理器为授权 header 生成了令牌,如下图所示。

Generated SAS Token

有人知道吗?我已经在这里搜索过了,唯一的 topic 没有帮助我。

您似乎正在尝试使用 REST API 从 "device" 访问设备孪生(因为您正在使用从设备 ID/Key 对生成的 SAS 令牌)。 这无法完成,因为与 "devices" 的设备孪生的交互是通过 MQTT 而不是通过 HTTP 完成的(有关 IoT 中心端点和孪生的文档,请参阅下面的链接)。如果你想从设备使用设备孪生,我建议你看一下 Azure IOT 设备 SDK。如果您想了解更多关于使用 MQTT 的信息,可以阅读 this.

但是,如果您想从后端角度使用设备孪生(如使用后端应用程序为设备设置所需属性、读取设备报告的属性并使用标签),那么您需要使用生成的 SAS 令牌来自 IoT 中心共享访问策略之一 name/key(不是设备凭据)。尝试使用相同的 Device Explorer 工具生成 SAS 令牌,但是在 "Configuration" 选项卡上。

有关设备孪生的一些文档可以帮助使所有这些内容更加清晰:

Device Twin description

IoT Hub endpoints

您可以使用 Postman 预请求脚本沙箱生成 SAS 令牌。这是我写的一篇博客 post,其中详细介绍了生成 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"));

来自 your picture, you used the specified device SAS token. While you need use IoT Hub SAS token it can grant access control and permissions。您可以像这样使用 Device Explorer 获取它:

并且发送Get请求成功后会得到设备孪生信息,在postman中是这样的: