Squeak.ru - шаблоны программирования

Кодирование / шифрование заголовка авторизации Azure Log Analytics в node.js

Я пытался заставить 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);
        }
    }

  • Я обновил свой ответ, добавив образец кода Node.js. Я протестировал его, и он отлично работал на моем сайте. Попробуй! 14.06.2017

Ответы:


1

Сначала вам нужно расшифровать общий ключ. Попробуйте изменить следующие строки кода:

authorization = crypto.createHmac('sha256', sharedKey).update(authorization.toString('utf8')).digest('base64');
authorization = 'Authorization: SharedKey ' + workspaceId + ':' + authorization;

to:

authorization = crypto.createHmac('sha256', new Buffer(sharedKey, 'base64')).update(authorization, 'utf-8').digest('base64');
var signature = 'SharedKey ' + workspaceId + ':' + authorization;

Тогда заголовок запроса будет выглядеть так:

headers: {
    'content-type': 'application/json',
    'Authorization': signature,
    'Log-Type': <log_type>,
    'x-ms-date': processingDate
},

Пример кода Node.js

var request = require('request');
var crypto = require('crypto');

// Azure Log Analysis credentials
var workspaceId = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
var sharedKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

var apiVersion = '2016-04-01';
var processingDate = new Date().toUTCString();

var jsonData = [{
   "slot_ID": 12345,
    "ID": "5cdad72f-c848-4df0-8aaa-ffe033e75d57",
    "availability_Value": 100,
    "performance_Value": 6.954,
    "measurement_Name": "last_one_hour",
    "duration": 3600,
    "warning_Threshold": 0,
    "critical_Threshold": 0,
    "IsActive": "true"
},
{   
    "slot_ID": 67890,
    "ID": "b6bee458-fb65-492e-996d-61c4d7fbb942",
    "availability_Value": 100,
    "performance_Value": 3.379,
    "measurement_Name": "last_one_hour",
    "duration": 3600,
    "warning_Threshold": 0,
    "critical_Threshold": 0,
    "IsActive": "false"
}]

var body = JSON.stringify(jsonData);    

var contentLength = Buffer.byteLength(body, 'utf8');

var stringToSign = 'POST\n' + contentLength + '\napplication/json\nx-ms-date:' + processingDate + '\n/api/logs';
var signature = crypto.createHmac('sha256', new Buffer(sharedKey, 'base64')).update(stringToSign, 'utf-8').digest('base64');
var authorization = 'SharedKey ' + workspaceId + ':' + signature;

var headers = {
    "content-type": "application/json", 
    "Authorization": authorization,
    "Log-Type": 'WebMonitorTest',
    "x-ms-date": processingDate
};

var url = 'https://' + workspaceId + '.ods.opinsights.azure.com/api/logs?api-version=' + apiVersion;

request.post({url: url, headers: headers, body: body}, function (error, response, body) {
  console.log('error:', error); 
  console.log('statusCode:', response && response.statusCode); 
  console.log('body:', body); 
});
14.06.2017
  • Спасибо, что посмотрели на это, Аарон. Я только что изменил код и получаю эту ошибку 403: {Ошибка: InvalidAuthorization, Сообщение: в заголовке авторизации указана недопустимая схема} 14.06.2017
  • Также удалите Authorization: из переменной авторизации. 14.06.2017
  • Нам также не нужно ключевое слово var во второй строке. К сожалению, я все еще получаю 403 с этим сообщением. 14.06.2017
  • Вы все еще получаете сообщение В заголовке авторизации указана недопустимая схема? 14.06.2017
  • Не могли бы вы поделиться с нами полным кодом, который вы написали (включая способ отправки HTTP-запроса)? 14.06.2017
  • Да, проверьте репозиторий github выше для всей функции. Я еще не обновлял его вашими предложениями - только моя функция. Хотите получить доступ к нашему порталу Azure? 14.06.2017
  • Вот мои заголовки (с отредактированным workspaceId для конфиденциальности): {'content-type': 'application / json', Accept: 'application / json', 'x-ms-date': 'Wed, 14 Jun 2017 04:57 : 03 GMT ', авторизация:' SharedKey d3123b88-1d5c-4194-8824-68f2bbbcea24: CTONwl + MbV + lvqHTqT8MHY5fJBdUqbkLyoijWJBJN6A = ',' Log-Type ':' Log Function Test '} 14.06.2017
  • feedback.azure.com/forums/267889-log-analytics/suggestions/ :) 14.06.2017
  • Давайте продолжим это обсуждение в чате. 14.06.2017
  • Спасибо, Аарон. Я обновлю репозиторий github рабочим кодом. 14.06.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...