Я пытался заставить API сборщика журналов работать в функции Azure node.js, но застрял на ошибке 403 / Forbidden, которая указывает на то, что я неправильно формирую заголовок авторизации. Полный код находится в репозитории github здесь:
https://github.com/sportsmgmt-labs/Azure-Log-Analytics-Node-Function
Документация по API сборщика данных находится здесь:
https://docs.microsoft.com/en-us/azure/log-analytics/log-analytics-data-collector-api
Заголовок авторизации должен иметь следующий формат:
Авторизация: SharedKey {WorkspaceID}: {Signature}
Если подпись закодирована / зашифрована так:
Base64 (HMAC-SHA256 (UTF8 (StringToSign)))
Вот мой код, который создает заголовок авторизации:
var contentLength = Buffer.byteLength(req.body['log-entry'], 'utf8');
var authorization = 'POST\n' + contentLength + '\napplication/json\nx-ms-date:' + processingDate + '\n/api/logs';
// encode string using Base64(HMAC-SHA256(UTF8(StringToSign)))
authorization = crypto.createHmac('sha256', sharedKey).update(authorization.toString('utf8')).digest('base64');
authorization = 'Authorization: SharedKey ' + workspaceId + ':' + authorization;
Ответ сервера:
{"Error": "InvalidAuthorization", "Message": "В заголовке авторизации указана недопустимая схема"}
Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Спасибо!
Изменить: вот код Python для этого:
def build_signature(customer_id, shared_key, date, content_length, method, content_type, resource):
x_headers = 'x-ms-date:' + date
string_to_hash = method + "\n" + str(content_length) + "\n" + content_type + "\n" + x_headers + "\n" + resource
bytes_to_hash = bytes(string_to_hash).encode('utf-8')
decoded_key = base64.b64decode(shared_key)
encoded_hash = base64.b64encode(hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest())
authorization = "SharedKey {}:{}".format(customer_id,encoded_hash)
return authorization
... и код C #:
static void Main()
{
// Create a hash for the API signature
var datestring = DateTime.UtcNow.ToString("r");
string stringToHash = "POST\n" + json.Length + "\napplication/json\n" + "x-ms-date:" + datestring + "\n/api/logs";
string hashedString = BuildSignature(stringToHash, sharedKey);
string signature = "SharedKey " + customerId + ":" + hashedString;
PostData(signature, datestring, json);
}
// Build the API signature
public static string BuildSignature(string message, string secret)
{
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = Convert.FromBase64String(secret);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hash = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hash);
}
}
Authorization:
из переменной авторизации. 14.06.2017