Генерация токенов безопасности Azure IOT Hub с помощью mbed
Мы подключаемся к Azure IOT Hub с учетными данными, созданными с помощью обозревателя устройств. Однако, поскольку срок действия этих учетных данных истекает, нашим устройствам IOT требуется возможность периодически генерировать учетные данные.
Наше устройство работает под mbed
поэтому мы пытаемся использовать mbed
библиотеки в C++ для генерации подписи.
Из инструкций Azure:
Маркер безопасности имеет следующий формат:
SharedAccessSignature sig={signature-string}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Мы создали подпрограмму для генерации подписи и полного токена безопасности. Тем не менее, соединение отклоняется, когда мы используем это значение. Из проверки различных значений мы можем сказать, что проблема заключается в поле подписи.
Наш код:
unsigned char inputVal[90];
unsigned char outputVal[60];
string GenerateSasToken (string resourceUri, string key, int expiryInSecs)
{
string *expiryStr;
const mbedtls_md_info_t *md_info;
string *stringToSign;
std::vector<uint8_t> keyVector;
string *sasKey;
string *password;
md_info = mbedtls_md_info_from_string("SHA256");
expiryStr = new string("1552139574");
stringToSign = new string();
*stringToSign = UrlEncode(resourceUri) + "\n" + *expiryStr;
logInfo("encode url: %s size: %d", stringToSign->data(), stringToSign->size());
mts::Text::base642bin(key, keyVector);
memcpy (inputVal, stringToSign->data(), stringToSign->size());
logInfo("input: key vector size: %d string size: %d", keyVector.size(), stringToSign->size());
mbedtls_md_hmac(md_info, keyVector.data(), keyVector.size(), inputVal, stringToSign->size(), outputVal);
sasKey = new(string);
*sasKey = mts::Text::bin2base64(outputVal, keyVector.size()); // sizeof(outputVal));
logInfo("sas token: %s", sasKey->data());
password = new(string);
*password = "SharedAccessSignature sr=" + UrlEncode(resourceUri) + "&sig=" + UrlEncode(sasKey->data()) + "&se=" + *expiryStr;
logInfo("password: %s", password->data());
delete sasKey;
delete password;
delete expiryStr;
delete stringToSign;
return *password;
}
Любые предложения о том, что не так? Спасибо