2017-09-16 105 views
0

我正在用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的负载,但是在格式化等方面一切都是一样的。我实际上并没有使用散列签名,我可以在理清这个之后做到这一点错误。我试过在冒号后加一个空格,并用双引号括住字符串和/或值,但我得到了相同的响应。我在做什么错误,这意味着我的标题实际上并未被服务器识别?

+0

您的签名看起来不像'HMAC-SHA256'。这也只是一个样本或实际价值? –

+0

@ArtemyVysotsky我提交的值为1,希望得到一个无效签名的服务器响应,而不是无效的API(只是试图控制所有其他变量,直到我能解决此问题)。如果你碰巧知道应该如何添加这个对我来说会有帮助的东西,它只是作为一个字符串添加的? – Jamieh

+0

你可以自己看看https://www.freeformatter.com/hmac-generator.html - 将你的随机数作为值和密钥保密并选择SHA256 –

回答

0

解决:当您的API密钥不正确,但签名不正确时,Blinktrade服务器返回“无效APIKey”。一个令人讨厌的错误标签。