Заголовок авторизации в HTTP POST Azure [код ошибки 401] - PullRequest
0 голосов
/ 04 сентября 2018

Я следую по этой ссылке , чтобы выполнить HTTP POST для Eventhub в Azure. я получаю ошибку 401 40103: неверная подпись токена авторизации. Согласно Azure, POST должен иметь следующий формат:

POST https://your-namespace.servicebus.windows.net/your-event-hub/partitions/0/messages?timeout=60&api-version=2014-01 HTTP/1.1  
Authorization: SharedAccessSignature sr=your-namespace.servicebus.windows.net&sig=your-sas-key&se=1403736877&skn=RootManageSharedAccessKey  
Content-Type: application/atom+xml;type=entry;charset=utf-8  
Host: your-namespace.servicebus.windows.net  

По поводу заголовка авторизации у меня есть несколько вопросов:

  1. Мой секретный ключ (сиг) имеет знак равенства, я должен заменить его на % 3d?
  2. В настоящее время я также выполняю операцию POST с примеры скриптов на Python и C из Azure. В этих примерах требуется только ввести конечную точку со всеми учетными данными и Операции post / get работают нормально. Можно ли выполнить операции put / get, вводящие непосредственно конечную точку в API отдых или получение авторизационного заголовка, который выполняется ниже код питона или c?

Спасибо.

1 Ответ

0 голосов
/ 05 сентября 2018

Я могу заставить его работать, создав политику SAS (nssend ниже) в пространстве имен , а не в концентраторе событий.

$ curl -X POST -i "https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages" \
    -H "Authorization: SharedAccessSignature sr=https%3A%2F%2Fbreakingnews.servicebus.windows.net%2Fsucheventsmuchwow%2Fmessages&sig=SAS_SIG_GOES_HERE&se=1536733370&skn=nssend" \
    -H "Content-Type: application/json" \
    --data-ascii "{ \"message\": \"So many events, so little time.\" }"


HTTP/1.1 201 Created
Server: Microsoft-HTTPAPI/2.0
...

Так что это работает.

Однако я получаю HTTP 401, как и вы, при использовании политики SAS уровня Event Hub для генерации подписи (в отличие от политики уровня пространства имен).

Это то, что я использовал для создания токена SAS & mdash;

// Make a SAS token
// See https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token
// Appologies for JavaScript
// npm install moment

const moment = require('moment');
const crypto = require('crypto');

function create_sas_token(uri, key_name, key)
{
    // Token expires in one hour
    var expiry = moment().add(7, 'days').unix();

    var string_to_sign = encodeURIComponent(uri) + '\n' + expiry;
    var hmac = crypto.createHmac('sha256', key);
    hmac.update(string_to_sign);
    var signature = hmac.digest('base64');
    var token = 'SharedAccessSignature sr=' +
        encodeURIComponent(uri) +
        '&sig=' + encodeURIComponent(signature) +
        '&se=' + expiry + '&skn=' + key_name;

    return token;
}

let token = create_sas_token('https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages', 'MySendPolicy', 'MySendPolicyPrimaryKey=');

console.log(token);

UPDATE

Спасибо Клеменсу Вастерсу -

Попробуйте опустить "/ messages"

& mdash; Клеменс Вастерс, Messenger (@clemensv)
5 сентября 2018

В строке для подписи (URI ресурса) должно быть пропущено /messages, например,

create_sas_token('https://breakingnews.servicebus.windows.net/sucheventsmuchwow',
    'MyEventHubLevelPolicy', 'hUbPriMAry/KEy=');

затем обработайте ваш запрос следующим образом -

$ curl -X POST -i "https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages" \
    -H "Authorization: SharedAccessSignature sr=https%3A%2F%2Fbreakingnews.servicebus.windows.net%2Fsucheventsmuchwow&sig=DONT_INCLUDE_/MESSAGES_IN_STRING_TO_SIGN&se=1536757127&skn=MyEventHubLevelPolicy" \
    -H "Content-Type: application/json" \
    --data-ascii "{ \"message\": \"SAS signed with Event Hub level policy\" }"


HTTP/1.1 201 Created
Server: Microsoft-HTTPAPI/2.0
...

TL; DR:

Ваш POST URL должен включать в себя завершающий /messages, но строка для подписи (URI ресурса) не должна. Всегда. Независимо от того, используется ли пространство имен или политика в области концентратора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...