web-dev-qa-db-ja.com

認証されたKrakenAPIにアクセスするためのcURLの例

KrakenプライベートAPI( https://www.kraken.com/help/api )のクライアントを実装しようとしていますが、問題が発生しているため、 cURLを使用して同じAPIにアクセスしようとしています。

しかし、私はそれを機能させることができず、ハッシュとダイジェストを生成するために適切なコマンドラインツールを使用していない可能性があると思います。

プライベート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"]}_

しかし、どの順列を試しても、「無効な署名」エラーが発生し続けます。

これらの順列には、以下が含まれますが、これらに限定されません。

  • API-Sign値をエンコードするBase64(all公開されているKrakenクライアントがこれを行います)、
  • base64でエンコードされるものはすべて大文字にします。
  • uRIパスの前の「/」を省略して、
  • sHA256の前に実際のナンス番号を省略します。
5
aerique

Meuhのおかげで私は問題を理解しました。他の人が私と同じくらいばかげていると想像できるので、私は自分の質問に答えます:

問題は、バイトの代わりに文字列を使用していることです。コマンドラインとcURLについて理解する時間がありません(おそらく他の誰かがそれをしたいと思っているので、その答えを受け入れます)。

作業中のクライアントの場合、_/0/private/Balance_とSHA256 16進文字列_353f9df92ab1d5e5afe06bb7d1bb42a8ef6654b633d94818007aeafbaf03ca3d_を連結する代わりに、 "/ 0/private/Balance"(_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_)(今回は10進値として表示されます)。

SHA512HMACについても同じです。

編集:

誰かが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 =="は ""secret"" BASE64でエンコードされています。もちろん、これはyoursecret)
  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