Generarea șirurilor de autentificare (API REST)

Ultima actualizare: 7 octombrie 2026

Unele endpoint-uri REST permit efectuarea unor operațiuni sensibile, cum ar fi plasarea de ordine sau solicitarea retragerii unui activ digital. Aceste endpoint-uri private pot fi apelate doar prin solicitări criptate, iar fiecare astfel de solicitare trebuie să conțină un șir de autentificare (authent). authent se calculează pe baza următoarelor date de intrare:

PostData

postData reprezintă o concatenare cu „&" în forma = și este specifică fiecărui endpoint REST.

Exemplu

Pentru a utiliza endpoint-ul orderbook, alege argumentul symbol cu valoarea
fi_xbtusd_180615. postData este astfel definit prin symbol=fi_xbtusd_180615.

Actualizarea fluxului de autentificare pentru endpoint-urile v3: Începând cu 20 februarie 2024, pentru a ne alinia la cele mai bune practici și a asigura un standard de securitate mai ridicat, vom actualiza fluxul de autentificare pentru endpoint-urile noastre /derivatives/* (v3). (detalii mai jos)

Modificări în generarea PostData:


- Înainte de lansare: Clienții trebuiau să aplice hash parametrilor query string înainte de url-encoding pentru generarea Authent, de ex., `greeting=hello world`.


- După lansare: Procesul de autentificare va necesita acum aplicarea hash-ului întregii componente URI url-encoded, așa cum apare în solicitare, de ex., `greeting=hello%20world`. Această metodă îmbunătățește securitatea și respectă cele mai bune practici.
Această actualizare este deosebit de relevantă pentru endpoint-ul v3 batchorder, care acceptă un corp JSON în parametrii săi de interogare.


Retrocompatibilitate și planuri de viitor:


Deocamdată, această modificare este retrocompatibilă. Platforma va accepta ambele metode de generare PostData descrise mai sus. Intenționăm totuși să eliminăm în viitor metoda veche (aplicarea hash-ului parametrilor query string decodificați), pentru a menține cele mai înalte standarde de securitate. Vom anunța din timp această schimbare și îi încurajăm cu tărie pe toți clienții să treacă la metoda nouă cât mai curând posibil, pentru a asigura continuitatea neîntreruptă a serviciului.

Nonce

nonce este un parametru de tip întreg cu incrementare continuă. Un nonce optim este timpul sistemului în
milisecunde (în format șir de caractere). Sistemul nostru tolerează nonce-uri în afara ordinii pentru o scurtă perioadă de timp. Nonce nu este obligatoriu.

Exemplu 1415957147987

Multe probleme de autentificare sunt cauzate de un nonce incorect. O nouă pereche de chei API va reseta automat nonce-ul și va rezolva aceste probleme.

Calea endpoint-ului

endpointPath reprezintă extensia URL a endpoint-ului.

Exemplu /api/v3/orderbook

API Secret

api_secret se obține conform descrierii din secțiunea anterioară.

Exemplu

rttp4AzwRfYEdQ7R7X8Z/04Y4TZPa97pqCypi3xXxAqftygftnI6H9yGV+O
cUOOJeFtZkr8mVwbAndU3Kz4Q+eG

Pe baza acestor date de intrare, authent trebuie calculat după cum urmează:

  1. 1

    Concatenează

    postData

    +

    nonce

    +

    endpointPath

  2. 2

    Aplică algoritmul SHA-256 asupra rezultatului de la pasul 1

  3. 3

    Decodifică Base64 api_secret-ul tău

  4. 4

    Folosește rezultatul de la pasul 3 pentru a aplica algoritmul HMAC-SHA-512 asupra rezultatului de la pasul 2

  5. 5

    Codifică Base64 rezultatul de la pasul 4

Exemplu

Mai jos este prezentată o implementare a authent în Java. Pentru exemple funcționale complete în diferite limbaje de programare, consultă secțiunea Resurse suplimentare. public static String getAuthent(String postData, String nonce, String endpointPath, String secretKeyBase64)
{
Mac mac512;
MessageDigest sha256;
try {
SecretKey secretKey = new SecretKeySpec 
(Base64.decode(secretKeyBase64.getBytes()), HMAC_SHA_512);
mac512 = Mac.getInstance(HMAC_SHA_512);
mac512.init(secretKey);
sha256 = MessageDigest.getInstance("SHA-256");
} catch (IOException e) {
...
} catch (InvalidKeyException e) {
...
} catch (NoSuchAlgorithmException e) {
...
} sha256.update(postData.getBytes());
sha256.update(nonce.getBytes());
sha256.update(endpointPath.getBytes());
mac512.update(sha256.digest());
return Base64.encodeBytes(mac512.doFinal()).trim();
}