Заголовки C++ libcurl - не распознаются сервером

Я работаю на С++ с libcurl, пишу программу для взаимодействия с некоторыми API, и я застрял, когда дело доходит до добавления информации об аутентификации в заголовки. Я новичок в libcurl и API с базовыми знаниями C++. Для аутентификации требуется ключ API и одноразовый номер, хэшированный с помощью HMAC_SHA256, каждый из которых затем помещается в заголовки. Затем отправляется очень простое сообщение JSON. Я пробовал искать на этом сайте, но большинство примеров, похоже, находятся в javascript или командной строке, и я не вижу в них подходящих ответов.

Когда я отправляю сообщение POST на сервер, я получаю ответ 402 — Invalid ApiKey. Мой ключ API на 100% правильный, поэтому я подозреваю, что это как-то связано с форматированием или тем, как я включил его в заголовок. Это сайт BlinkTrade, и их документация находится здесь, что дает некоторую информацию о заголовке. требования.

Фрагмент кода ниже:

char* message="{\"MsgType\": \"U2\",\"BalanceReqID\": 1}";
curl_easy_setopt(curl, CURLOPT_URL, "https://api.blinktrade.com/tapi/v1/message");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, pFile2);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, message);

struct curl_slist *header = NULL;
header = curl_slist_append(header, "APIKey:0000000000000000000000000000000000000000");    
header = curl_slist_append(header, "Nonce:1");
header = curl_slist_append(header, "Signature:1");
header = curl_slist_append(header, "Content-Type:application/json");
transfer = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
cout << transfer << endl;

transfer = curl_easy_perform(curl);
cout << transfer << endl;

И я получаю код возврата 0 для curl_easy_setopt и curl_easy_perform. Я заменил фактические символы из ключа API на загрузку 0, но в остальном все то же самое с точки зрения форматирования и т. д. На самом деле я не использовал хешированную подпись, я сделаю это после того, как разберусь с этим ошибка. Я пробовал добавлять пробел после двоеточия и заключать строку и/или значение в двойные кавычки, но получаю тот же ответ. Что я делаю неправильно, что означает, что мои заголовки на самом деле не распознаются сервером?


person Jamieh    schedule 16.09.2017    source источник
comment
Ваша подпись не похожа на HMAC-SHA256 что-то. Это тоже просто образец или реальная стоимость?   -  person Artemy Vysotsky    schedule 16.09.2017
comment
@ArtemyVysotsky Я отправляю значение 1 в надежде получить ответ сервера на неверную подпись, а не на недопустимый API (просто пытаюсь контролировать все остальные переменные, пока не исправлю эту проблему). Если вы знаете, как это следует добавить, это поможет, когда я дойду до этого, это просто добавлено в виде строки?   -  person Jamieh    schedule 17.09.2017
comment
вы можете сами убедиться в этом freeformatter.com/hmac-generator.html - поместите свой одноразовый номер в качестве значения и ключ в качестве секрета и выберите SHA256   -  person Artemy Vysotsky    schedule 17.09.2017


Ответы (1)


Решено: сервер Blinktrade возвращает «Invalid APIKey» не тогда, когда ваш ключ API неверен, а когда подпись неверна. Довольно раздражающая неправильная маркировка.

person Jamieh    schedule 06.10.2017