пример cURL для доступа к аутентифицированному API Kraken

Я пытаюсь реализовать клиент для Кракен частный API (https://www.kraken.com/help/api) и потому что я натыкаюсь на некоторые проблемы с этим, я пытаюсь открыть те же API с curl.

тем не менее, я не могу получить за жизнь меня заставить его работать, и я думаю, что я не могу использовать правильные инструменты командной строки для создания хэшей и дайджестов.

при доступе к закрытому API необходимо добавить следующие заголовки просьба:

API-Key = «key»
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded «secret»

в командной строке я делаю следующие действия:

  • echo -n "123nonce=123" | openssl sha256

результат: (stdin)= 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d

  • echo -n "/0/private/Balance353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d" | openssl sha512 -hmac $(echo -n "wqtzZWNyZXTCuw==" | base64 -d)

результат: (stdin)= 6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d

  • echo -n "6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d" | base64

результат:

NmYxOWY4ZjA1OGIwZTZkYzgzNTY5Mjg0MGNjZGViYzFjNDE1ZjAwZDQyYjc1YjNkM2MyMWVmNWZk
NDNmMDA2ZTMwY2M5YjUxYzYzYWJhMzI2OGE1MzRiZjY4OTc4ZDYwZDIzNjJiZmZkMzFjODEyNTU1
M2ZiOGVjNDFiMmY2NGQ=
  • curl -X POST -H "Accept: application/json" -H "API-Key: «key»" -H "API-Sign: NmYxOWY4ZjA1OGIwZTZkYzgzNTY5Mjg0MGNjZGViYzFjNDE1ZjAwZDQyYjc1YjNkM2MyMWVmNWZkNDNmMDA2ZTMwY2M5YjUxYzYzYWJhMzI2OGE1MzRiZjY4OTc4ZDYwZDIzNjJiZmZkMzFjODEyNTU1M2ZiOGVjNDFiMmY2NGQ=" -d "nonce=123" https://api.kraken.com/0/private/Balance

результат (при условии, что действительны "ключ" и "секрет"):{"error":["EAPI:Invalid signature"]}

но независимо от того, какие перестановки я пытаюсь я продолжайте получать ошибку "недопустимая подпись".

эти перестановки включают, но не ограничиваются:

  • Base64 кодирование значения знака API (все общедоступные клиенты Kraken делают это),
  • uppercasing каким должен быть закодирован в base64,
  • оставляя '/' перед путем URI,
  • оставляя фактический номер nonce в передней части SHA256.
5
задан aerique
источник

1 ответов

благодаря meuh я понял проблему. Поскольку я могу представить, что другие люди так же глупы, как я, я отвечу на свой вопрос:

проблема в том, что я использую строки вместо байтов. У меня нет времени, чтобы понять это для командной строки и cURL (возможно, кто-то еще хочет это сделать, и я приму этот ответ).

для клиента, над которым я работал, вместо объединения /0/private/Balance и шестнадцатеричная строка SHA256 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d Я должен объединить байт для "/0 / private / баланс" (47 48 47 112 114 105 118 97 116 101 47 66 97 108 97 110 99 101) и SHA256("123nonce=123") (53 63 157 249 42 177 213 229 175 224 107 183 209 187 66 168 239 102 84 182 51 217 72 24 0 122 234 251 175 3 202 61) (на этот раз в виде десятичных значений).

то же самое для SHA512 HMAC.

Edit:

так как кто-то спросил на Twitter, это фактические шаги, чтобы сделать это в командной строке:

  1. echo -n "/0/private/Balance" > tmp.bin
  2. echo -n "123nonce=123" | openssl sha256 -binary >> tmp.bin
  3. cat tmp.bin | openssl sha512 -binary -hmac $(echo -n "wqtzZWNyZXTCuw==" | base64 -d) | base64 ("wqtzZWNyZXTCuw==" это ""секрет"" в кодировке base64, это должно, конечно, быть код секрет)
  4. curl -X POST -H "Accept: application/json" -H "API-Key: «key»" -H "API-Sign: «output-from-step-3»" -d "nonce=123" https://api.kraken.com/0/private/Balance

как вы можете видеть выше, единственное, что было забыто в исходном вопросе, - это использование -binary переключатель.

Примечание: ваш ключ API и секрет будет в конечном итоге на командной строке (видимый с ps aux) и в командной строке истории!

5
отвечен aerique 2017-07-23 13:32:46
источник

Другие вопросы api base64 bash curl openssl