Неавторизованный API остаточного центра Azure IOT


person ddfish    schedule 14.12.2016    source источник
comment
Вы когда-нибудь находили решение? Я столкнулся с той же проблемой.   -  person IgorGanapolsky    schedule 22.11.2017
comment
Нашли решение? сталкиваясь с тем же, пожалуйста, помогите   -  person Vishal Solanki    schedule 21.02.2019


Ответы (5)


Проблема 401, вероятно, в том, как вы вычисляете SAS. Полный процесс расчета SAS для Центра Интернета вещей (на C #):

private static readonly DateTime epochTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

public static string SharedAccessSignature(string hostUrl, string policyName, string policyAccessKey, TimeSpan timeToLive)
{
  if (string.IsNullOrWhiteSpace(hostUrl))
  {
    throw new ArgumentNullException(nameof(hostUrl));
  }

  var expires = Convert.ToInt64(DateTime.UtcNow.Add(timeToLive).Subtract(epochTime).TotalSeconds).ToString(CultureInfo.InvariantCulture);
  var resourceUri = WebUtility.UrlEncode(hostUrl.ToLowerInvariant());
  var toSign = string.Concat(resourceUri, "\n", expires);
  var signed = Sign(toSign, policyAccessKey);

  var sb = new StringBuilder();
  sb.Append("sr=").Append(resourceUri)
    .Append("&sig=").Append(WebUtility.UrlEncode(signed))
    .Append("&se=").Append(expires);
  if (!string.IsNullOrEmpty(policyName))
  {
    sb.Append("&skn=").Append(WebUtility.UrlEncode(policyName));
  }
  return sb.ToString();
}

private static string Sign(string requestString, string key)
{
  using (var hmacshA256 = new HMACSHA256(Convert.FromBase64String(key)))
  {
    var hash = hmacshA256.ComputeHash(Encoding.UTF8.GetBytes(requestString));
    return Convert.ToBase64String(hash);
  }
}

Если вы хотите создать устройство в IoTHub, у вас должна быть политика с полными разрешениями, которые означают: чтение и запись реестра, подключение службы и подключение устройства. Если вам нужен полнофункциональный пример на C # о том, как использовать REST API Центра Интернета вещей для создания устройства, проверьте, существует ли устройство, и отправьте сообщения в Центр Интернета вещей, который я написал этот пост об этом (сообщение на испанском языке, но я могу представить, что вы нужен только код).

person Fabio Maulo    schedule 11.01.2017

похоже, что ваш SAS неправильный. Он не должен включать в себя часть устройств в конце. Если вы откроете обозреватель устройств Iot Hub, вы можете сгенерировать токен SAS для доступа к API Iot Hub. Вы должны создать SAS для уровня концентратора IoT и для уровня устройства (которые включают идентификатор devive в SAS, как и у вас). Итак, ваш SAS должен выглядеть так: SharedAccessSignature sr = {имя концентратора iot} .azure-devices.net & sig = {sig} & se = {se} & skn = iothubowner

person shachar    schedule 14.12.2016
comment
Я более знаком с .NET API, но концепции и роли остались прежними. % 2fdevices% 2ftest123 в конце вашего заголовка не должно быть. Авторизация предназначена для вас как актера хаба (iothubowner), а не для самого устройства, устройство указано в ваших http-данных. Как говорит Шахар, Iot Hub Device Explorer сгенерирует это для вас, кроме того, вы все равно захотите, чтобы он был в вашем наборе инструментов. - person Greg Terrell; 15.12.2016

Вам нужно сделать две правки:

  1. В ваших http-данных только deviceId обязательны, другие необязательны, это можно сделать так:

{ deviceId: "test123" }

Обратите внимание, что идентификатор устройства не заключен в двойные кавычки.

  1. Как сказал @shachar, вам нужно удалить «% 2fdevices% 2ftest123» в токене SAS заголовка. Для создания токена SAS вы можете использовать Device Explorer.

Это результат моего теста:

введите здесь описание изображения

person Rita Han    schedule 15.12.2016

Вы используете неправильный формат токена SAS. Чтобы создать устройство, вам необходимо использовать SAS Token для IoT Hub. Вы можете легко использовать расширение Azure IoT Toolkit для Visual Studio Code, чтобы сгенерировать токен SAS для IoT Hub, как показано на скриншоте ниже.

Токен SAS для Центра Интернета вещей

Кстати, формат токена SAS для устройства - /^SharedAccessSignature sr=iot-hub-test.azure-devices.net%2Fdevices%2Fdevice1&sig=.+&se=.+$/, а формат токена SAS для IoT Hub - /^SharedAccessSignature sr=iot-hub-test.azure-devices.net&sig=.+&skn=iothubowner&se=.+$/

person Jun Han    schedule 19.07.2018

// Следующий код предназначен для программного создания токена SAS.

string sasToken = new SharedAccessSignatureBuilder()
{  KeyName = name,
 Key = key,
 Target = target,
 TimeToLive = TimeSpan.FromDays(days)
}.ToSignature();

// использовать этот токен sas в качестве заголовка авторизации перед вызовом iot restapi

person Naveen kumar Srimurthi    schedule 07.02.2019