2017-09-16 104 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」。一個令人討厭的錯誤標籤。