Generar cadenas de autenticación (API REST)

Última actualización: 31 mar 2025

Algunos puntos finales de la API REST permiten realizar operaciones sensibles como la colocación de órdenes o la solicitud de un retiro de activos digitales. Por lo tanto, estos puntos finales privados solo pueden invocarse a través de solicitudes cifradas y cada solicitud debe incluir una cadena de autenticación (authent). authent se calcula a partir de las siguientes entradas:

PostData

postData es una concatenación de "&" en la forma <argumento>=<valor> y es específica para cada punto final de la API REST.

Ejemplo

Para operar el punto final orderbook, elija el argumento symbol con el valor
fi_xbtusd_180615. postData se da entonces por symbol=fi_xbtusd_180615.

Actualización del flujo de autenticación para los puntos finales v3: A partir del 20 de febrero de 2024, para alinearnos con las mejores prácticas y garantizar un estándar de seguridad más alto, vamos a actualizar el flujo de autenticación para nuestros puntos finales /derivatives/* (v3). (detalles a continuación)

Cambios en la generación de PostData:


- Antes del lanzamiento: Se requería que los usuarios aplicaran hash a los parámetros de la cadena de consulta antes de la codificación URL para la generación de Authent, por ejemplo, `greeting=hello world`.


- Después del lanzamiento: El proceso de autenticación ahora requerirá aplicar hash al componente URI completo y codificado en URL tal como aparece en la solicitud, por ejemplo, `greeting=hello%20world`. Este método mejora la seguridad y se alinea con las mejores prácticas.
Esta actualización es particularmente relevante para el punto final v3 batchorder, que acepta un cuerpo JSON en sus parámetros de consulta.


Compatibilidad con versiones anteriores y planes futuros:


Por el momento, este cambio es compatible con versiones anteriores. La plataforma aceptará ambos métodos de generación de PostData descritos anteriormente. Sin embargo, nuestro objetivo es eliminar gradualmente el método antiguo (aplicar hash a los parámetros de la cadena de consulta decodificados) en el futuro para mantener los más altos estándares de seguridad. Proporcionaremos un aviso con suficiente antelación a este cambio y recomendamos encarecidamente a todos los usuarios que hagan la transición al nuevo método lo antes posible para garantizar una continuidad del servicio sin interrupciones.

Nonce

nonce es un parámetro entero que se incrementa continuamente. Un buen nonce es la hora de su sistema en
milisegundos (en formato de cadena). Nuestro sistema tolera nonces que están fuera de orden por un breve período de tiempo. Nonce no es obligatorio.

Ejemplo 1415957147987

Muchos problemas de autenticación están relacionados con un nonce incorrecto. Un nuevo par de claves API restablecerá automáticamente el nonce y resolverá estos problemas.

Ruta del punto final

endpointPath Esta es la extensión URL del punto final.

Ejemplo /api/v3/orderbook

Secreto de la API

El api_secret se obtiene como se describe en la sección anterior.

Ejemplo

rttp4AzwRfYEdQ7R7X8Z/04Y4TZPa97pqCypi3xXxAqftygftnI6H9yGV+O
cUOOJeFtZkr8mVwbAndU3Kz4Q+eG

En base a estas entradas, authent debe calcularse de la siguiente manera:

  1. 1

    Concatenar

    postData

    +

    nonce

    +

    endpointPath

  2. 2

    Calcule el hash del resultado del paso 1 con el algoritmo SHA-256

  3. 3

    Decodifique Base64 su api_secret

  4. 4

    Utilice el resultado del paso 3 para calcular el hash del resultado del paso 2 con el algoritmo HMAC-SHA-512

  5. 5

    Codifique Base64 el resultado del paso 4

Ejemplo

A continuación se muestra una implementación de authent en Java. Para ver ejemplos completos y funcionales en diferentes lenguajes de programación, consulte la sección Recursos adicionales. 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();
}

¿Necesita más ayuda?