Ошибка аутентификации HTTP POST в локальных биткойнах - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь отправить POST-запрос на сервер API LocalBitcoins, но получаю только ошибки (41 и 43), несмотря на то, что запрос GET отлично работает даже с параметрами (аргументами).

Sub initrequest()

'this is a POST request with no arguments  that results in error  
JsonResponse = PrivateLocalBTC("POST", "/api/notifications/mark_as_read/9b9c2b5a16a3/")

'this is a GET request, with "ads=.." parameter, that works
'JsonResponse = PrivateLocalBTC("GET", "/api/ad-get/", "ads=771318")

Debug.Print JsonResponse

End Sub

и есть подпункт HTTP-запроса:

Function PrivateLocalBTC(Method As String, endpoint As String, Optional params As String) As String

Dim NonceUnique As String
NonceUnique = CreateNonce(13)
TradeApiSite = "https://localbitcoins.com"
apikey = "..............."
secretkey = "............"

Message = NonceUnique & apikey & endpoint & params
apisign = ComputeHash_C("SHA256", Message, secretkey, "STRHEX")
If params <> "" Then urlparams = "?" & params
Url = TradeApiSite & endpoint & urlparams

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open Method, Url, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.setRequestHeader "Apiauth-Key", apikey
objHTTP.setRequestHeader "Apiauth-Nonce", NonceUnique
objHTTP.setRequestHeader "Apiauth-Signature", apisign
objHTTP.Send ("")

objHTTP.waitForResponse
PrivateLocalBTC = objHTTP.ResponseText
Set objHTTP = Nothing
End Function

Я пробовал много вариантов размещения конечной точки, nonce, apikey в теле запроса в команде .Send, urlencoding, но без положительного результата.

ComputeHash_C, CreateNonce - это отдельные функции. Код вдохновлен большой общей работой https://github.com/krijnsent/crypto_vba!

Документ API LocalBitcoins находится здесь: https://localbitcoins.com/api-docs/

1 Ответ

0 голосов
/ 10 января 2019

Похоже, что после того, как затормозил мозги над проблемой, нужно опубликовать вопрос в stackoverflow, чтобы получить откровение для ответа ... Я понял, что использую apikey, который может только читать с сервера, поэтому естественно, не может изменить данные сервера с помощью запроса POST. Создание и использование правильного ключа с правами на запись решило проблему! Рабочий код:

Function PrivateLocalBTC(Method As String, endpoint As String, Optional params As String) As String
'Method "GET', "POST"
'params format: "argument1=value&argument2=value&...."

Dim NonceUnique As String
NonceUnique = CreateNonce(13)
TradeApiSite = "https://localbitcoins.com"
apikey = "..............."
secretkey = "............"

Message = NonceUnique & apikey & endpoint & params
apisign = ComputeHash_C("SHA256", Message, secretkey, "STRHEX")
If params <> "" Then urlparams = "?" & params
Url = TradeApiSite & endpoint & urlparams

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open Method, Url, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.setRequestHeader "Apiauth-Key", apikey
objHTTP.setRequestHeader "Apiauth-Nonce", NonceUnique
objHTTP.setRequestHeader "Apiauth-Signature", apisign
objHTTP.Send params

objHTTP.waitForResponse
PrivateLocalBTC = objHTTP.ResponseText
Set objHTTP = Nothing
End Function

Единственная модификация - "objHTTP.Send params". Обязательно используйте правильные ключи API!

...