Punkty końcowe, które wymagają autoryzacji użytkownika będą dalej nazywane “metodami prywatnymi”. By z nich korzystać, należy utworzyć parę kluczy umożliwiających autoryzację tworzonej aplikacji. Można to zrobić pod adresem https://auth.zondacrypto.exchange/settings/api
Konkretna para kluczy powinna mieć uprawnienia tylko do modułów, z których rzeczywiście będzie korzystać. Parametry muszą zostać wysłane w formacie JSON, który umożliwia wygenerowanie hasza.
Aby odnieść się do dowolnej metody prywatnej, w nagłówku muszą znaleźć się następujące parametry autoryzacyjne:
Klucz | Opis |
---|---|
API-Key | Klucz publiczny w jawnej formie. |
API-Hash | HMAC("SHA512", klucz_publiczny + aktualny_timestamp + parametry_metody_JSON, klucz prywatny) |
operation-id | Jednorazowy, losowo wygenerowany UUID operacji. |
Request-Timestamp | Aktualny czas w formacie UNIX Timestamp. Ta sama wartość musi zostać użyta do wygenerowania hasza. |
Content-Type | Dwuczęściowy identyfikator formatu plików, domyślnie: application/json. |
Wartość API-Hash jest wygenerowaną wartością HMAC przy użyciu funkcji haszującej algorytmem SHA512 dla następujących danych:
- Klucz publiczny
- Aktualny czas w formacie UNIX Timestamp
- Dane, które zostały przesłane w formacie JSON (tylko w przypadku metod POST)
- Klucz prywatny (w niektórych bibliotekach podawany jest on jako osobny parametr będący kluczem szyfrowania)
Przykładowe wartości autoryzacji oraz gotowy kod:
API-Key: 12345f6f-1b1d-1234-a973-a10b1bdba1a1
API-Hash: 8892f16e0713c5f3e3d7e9fa26c5a5f2817b09fc48fece72ed5712ae33547c92e91e735b1818397136beea760efae61d1449a93e48ee2f80789dfa24830ef720
operation-id: 78539fe0-e9b0-4e4e-8c86-70b36aa93d4f
Request-Timestamp: 1529897422
Content-Type: application/json
<?php
class bitbayAPI
{
private $pubkey = '';
private $privkey = '';
public function __construct($pubkey, $privkey)
{
$this->pubkey = $pubkey;
$this->privkey = $privkey;
}
public function GetUUID($data)
{
assert(strlen($data) == 16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data) , 4));
}
public function callApi($method, $params = null, $type = 'GET')
{
$post = null;
if (($type == 'GET') && is_array($params)):
$method = $method . '?query=' . urlencode(json_encode($params));
elseif (($type == 'POST' || $type == 'PUT' || $type == 'DELETE') && is_array($params) && (count($params) > 0)):
$post = json_encode($params);
endif;
$time = time();
$sign = hash_hmac("sha512", $this->pubkey . $time . $post, $this->privkey);
$headers = array(
'API-Key: ' . $this->pubkey,
'API-Hash: ' . $sign,
'operation-id: ' . GetUUID(random_bytes(16)) ,
'Request-Timestamp: ' . $time,
'Content-Type: application/json'
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $type);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, 'https://api.bitbay.net/rest/' . $method);
if ($type == 'POST' || $type == 'PUT' || $type == 'DELETE') {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$ret = curl_exec($curl);
$info = curl_getinfo($curl);
return $ret;
}
}
'use strict'
const uuidv4 = require('uuid/v4');
const crypto = require('crypto');
const apiKey = '48249e33-fbad-4805-a752-a82fe216e933';
const apiSecret = '12cd3901-1d4f-4b24-82ef-fbbc36638b7c';
var body = null;
function getHash(apiKey, timestamp, apiSecret, body) {
const hmac = crypto.createHmac('sha512', apiSecret);
if (body)
hmac.update(apiKey + timestamp + JSON.stringify(body));
else
hmac.update(apiKey + timestamp);
return hmac.digest('hex');
};
let timestamp = Date.now();
var headers = {
'API-Key': apiKey,
'API-Hash': getHash(apiKey, timestamp, apiSecret, body),
'operation-id': uuidv4(),
'Request-Timestamp': timestamp,
'Content-Type': 'application/json'
};
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public abstract class APIHashGenerator {
public static String gemerate(String data, String key) {
String result = "";
try{
byte [] byteKey = key.getBytes("UTF-8");
final String HMAC_SHA512 = "HmacSHA512";
Mac sha512_HMAC = null;
sha512_HMAC = Mac.getInstance(HMAC_SHA512);
SecretKeySpec keySpec = new SecretKeySpec(byteKey, HMAC_SHA512);
sha512_HMAC.init(keySpec);
byte [] mac_data = sha512_HMAC.
doFinal(data.getBytes("UTF-8"));
result = bytesToHex(mac_data);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private static String bytesToHex(byte[] hashInBytes) {
StringBuilder sb = new StringBuilder();
for (byte b : hashInBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}