cURL exemplo para acessar a API do Kraken autenticada

4

Estou tentando implementar um cliente para a API privada do Kraken ( link ) e porque estou executando em alguns problemas com isso, eu tenho tentado acessar essa mesma API com cURL.

No entanto, não consigo fazer com que a minha vida funcione e acho que posso não estar usando as ferramentas de linha de comando certas para gerar os hashes e os resumos.

Ao acessar a API privada, os seguintes cabeçalhos precisam ser adicionados à solicitação:

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

Na linha de comando, faço os seguintes passos:

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

resultado: (stdin)= 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d

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

resultado: (stdin)= 6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d

  • echo -n "6f19f8f058b0e6dc835692840ccdebc1c415f00d42b75b3d3c21ef5fd43f006e30cc9b51c63aba3268a534bf68978d60d2362bffd31c8125553fb8ec41b2f64d" | base64

resultado:

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

resultado (assumindo "chave" e "segredo" válidos): {"error":["EAPI:Invalid signature"]}

Mas não importa quais permutações eu tente, recebo o erro "Assinatura inválida".

Essas permutações incluem, mas não estão limitadas a:

  • Base64 codifica o valor do sinal de API ( todos clientes do Kraken disponíveis publicamente fazem isso)
  • uppercasing, o que quer que seja codificado em Base64,
  • deixando de fora o '/' na frente do caminho do URI,
  • deixando de fora o número real do nonce na frente do SHA256.
por aerique 12.09.2016 / 15:26

1 resposta

5

Graças a meuh eu descobri a questão. Como posso imaginar outras pessoas sendo tão tolas quanto eu, responderei a minha própria pergunta:

O problema é que estou usando strings ao invés de bytes. Eu não tenho tempo para descobrir a linha de comando e cURL (talvez alguém queira fazer isso e eu aceito essa resposta).

Para o cliente em que estava trabalhando, em vez de concatenar /0/private/Balance e a string hexadecimal SHA256 353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d , deveria concatenar os bytes para "/ 0 / private / Balance" ( 47 48 47 112 114 105 118 97 116 101 47 66 97 108 97 110 99 101 ) e 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 ) (mostrado como valores decimais desta vez).

O mesmo para o SHA512 HMAC.

Editar:

Como alguém perguntou no Twitter, estas são as etapas reais para fazer isso na linha de comando:

  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 ==" é "segredo" "BASE64 codificado, isso deve ser, sem dúvida, o seu segredo )
  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

Como você pode ver acima, a única coisa que foi esquecida na pergunta original era usar a opção -binary .

Observação: sua chave e segredo da API terminarão na linha de comando (visível com ps aux ) e no histórico do shell!

    
por 13.09.2016 / 12:00