Generare stringhe di autenticazione (REST API)

Ultimo aggiornamento: 7 ottobre 2026

Alcuni endpoint REST consentono di eseguire operazioni sensibili, come il piazzamento di ordini o la richiesta di prelievo di asset digitali. Questi endpoint privati possono quindi essere richiamati solo tramite richieste criptate e ogni richiesta deve includere una stringa di autenticazione (authent). authent viene calcolato a partire dai seguenti input:

PostData

postData è una concatenazione con "&" nella forma = ed è specifico per ciascun endpoint REST.

Esempio

Per utilizzare l'endpoint orderbook, scegli l'argomento symbol con valore
fi_xbtusd_180615. postData sarà quindi symbol=fi_xbtusd_180615.

Aggiornamento del flusso di autenticazione per gli endpoint v3: a partire dal 20 febbraio 2024, per allinearci alle best practice e garantire un livello di sicurezza più elevato, aggiorneremo il flusso di autenticazione per i nostri endpoint /derivatives/* (v3). (dettagli di seguito)

Modifiche alla generazione di PostData:


- Prima del rilascio: i clienti dovevano eseguire l'hash dei parametri della query string prima della codifica URL per la generazione di Authent, ad es. `greeting=hello world`.


- Dopo il rilascio: il processo di autenticazione richiederà l'hash del componente URI completo con codifica URL, come appare nella richiesta, ad es. `greeting=hello%20world`. Questo metodo migliora la sicurezza e si allinea alle best practice.
Questo aggiornamento è particolarmente rilevante per l'endpoint v3 batchorder, che accetta un body JSON nei propri parametri di query.


Retrocompatibilità e piani futuri:


Per il momento, questa modifica è retrocompatibile. La piattaforma accetterà entrambi i metodi di generazione di PostData descritti sopra. Tuttavia, intendiamo eliminare gradualmente il vecchio metodo (hash dei parametri della query string decodificati) per mantenere i più elevati standard di sicurezza. Forniremo un adeguato preavviso prima di questa modifica e invitiamo tutti i clienti a passare al nuovo metodo il prima possibile, per garantire la continuità del servizio.

Nonce

nonce è un parametro intero a incremento continuo. Un buon nonce corrisponde all'ora di sistema in
millisecondi (in formato stringa). Il nostro sistema tollera nonce fuori sequenza per un breve periodo di tempo. Il nonce non è obbligatorio.

Esempio 1415957147987

Molti problemi di autenticazione sono legati a un nonce errato. Una nuova coppia di chiavi API reimposta automaticamente il nonce e risolve questi problemi.

Endpoint Path

endpointPath è l'estensione URL dell'endpoint.

Esempio /api/v3/orderbook

Segreto API

L'api_secret viene ottenuto come descritto nella sezione precedente.

Esempio

rttp4AzwRfYEdQ7R7X8Z/04Y4TZPa97pqCypi3xXxAqftygftnI6H9yGV+O
cUOOJeFtZkr8mVwbAndU3Kz4Q+eG

Sulla base di questi input, authent deve essere calcolato come segue:

  1. 1

    Concatena

    postData

    +

    nonce

    +

    endpointPath

  2. 2

    Esegui l'hash del risultato del passaggio 1 con l'algoritmo SHA-256

  3. 3

    Decodifica in Base64 il tuo api_secret

  4. 4

    Usa il risultato del passaggio 3 per eseguire l'hash del risultato del passaggio 2 con l'algoritmo HMAC-SHA-512

  5. 5

    Base64-encode il risultato del passaggio 4

Esempio

Di seguito è riportata un'implementazione di authent in Java. Per esempi funzionanti completi in diversi linguaggi di programmazione, consulta la sezione Risorse aggiuntive. 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();
}