我正在用C++编写libcurl程序来与一些API进行交互,而且我在添加头文件中的身份验证信息时遇到了困难。我对libcurl和API具有基本的C++知识。身份验证需要一个API密钥,并使用HMAC_SHA256对随机数进行哈希处理,然后将每个数据置于头文件中。然后发送一个非常简单的JSON消息。我试过通过这个网站搜索,但大多数例子似乎是在JavaScript或命令行,我没有看到任何相关的答案。C++ libcurl头文件 - 未被服务器识别
当我将POST消息发送到服务器时,我得到一个响应402 - 无效的ApiKey。我的API密钥是100%正确的,所以我怀疑这是格式化或者将它包含在标题中的方式。该网站是BlinkTrade,其文档是here,它提供了关于标题要求的一些信息。
下面的代码片段:
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;
我也得到了curl_easy_setopt和curl_easy_perform返回码0。我已经从API关键字的实际字符换成了0的负载,但是在格式化等方面一切都是一样的。我实际上并没有使用散列签名,我可以在理清这个之后做到这一点错误。我试过在冒号后加一个空格,并用双引号括住字符串和/或值,但我得到了相同的响应。我在做什么错误,这意味着我的标题实际上并未被服务器识别?
您的签名看起来不像'HMAC-SHA256'。这也只是一个样本或实际价值? –
@ArtemyVysotsky我提交的值为1,希望得到一个无效签名的服务器响应,而不是无效的API(只是试图控制所有其他变量,直到我能解决此问题)。如果你碰巧知道应该如何添加这个对我来说会有帮助的东西,它只是作为一个字符串添加的? – Jamieh
你可以自己看看https://www.freeformatter.com/hmac-generator.html - 将你的随机数作为值和密钥保密并选择SHA256 –