生成身份验证字符串 (REST API)

上次更新时间: 2025年3月31日

某些 REST 端点允许执行敏感操作,例如下订单或请求数字资产提款。因此,这些私有端点只能通过加密请求调用,并且每个此类请求中都必须包含一个身份验证字符串 (authent)。authent 是根据以下输入计算的:

PostData

postData 是 "&" 形式的连接,即 <argument>=<value>,并且特定于每个 REST 端点。

示例

要操作端点 orderbook,您选择参数 symbol,其值为
fi_xbtusd_180615。postData 则由 symbol=fi_xbtusd_180615 给出。

v3 端点的身份验证流程更新:截至 2024 年 2 月 20 日,为符合最佳实践并确保更高的安全标准,我们将更新 /derivatives/* (v3) 端点的身份验证流程。(详情如下)

PostData 生成变更:


- 发布前:用户需要先对查询字符串参数进行哈希处理,然后进行 URL 编码以生成 Authent,例如 `greeting=hello world`。


- 发布后:身份验证过程现在将要求对请求中出现的完整、经过 URL 编码的 URI 组件进行哈希处理,例如 `greeting=hello%20world`。此方法增强了安全性并符合最佳实践。
此更新对于 v3 batchorder 端点尤其重要,该端点在其查询参数中接受 JSON 正文。


向后兼容性和未来计划:


目前,此更改是向后兼容的。平台将接受上述两种 PostData 生成方法。但是,我们旨在未来逐步淘汰旧方法(对解码的查询字符串参数进行哈希处理),以保持最高的安全标准。我们将在更改前提供充足的通知,并强烈鼓励所有用户尽快过渡到新方法,以确保无缝的服务连续性。

Nonce

nonce 是一个持续递增的整数参数。一个好的 nonce 是您的系统时间(以毫秒为单位,字符串格式)。我们的系统在短时间内可以容忍乱序的 nonce。Nonce 不是必需的。

示例 1415957147987

许多身份验证问题都与不正确的 nonce 有关。一对新的 API 密钥将自动重置 nonce 并解决这些问题。

端点路径

endpointPath 这是端点的 URL 扩展。

示例 /api/v3/orderbook

API 密钥

api_secret 的获取方法如上一节所述。

示例

rttp4AzwRfYEdQ7R7X8Z/04Y4TZPa97pqCypi3xXxAqftygftnI6H9yGV+O
cUOOJeFtZkr8mVwbAndU3Kz4Q+eG

根据这些输入,authent 需要按以下方式计算:

  1. 1

    连接

    postData

    +

    nonce

    +

    endpointPath

  2. 2

    使用 SHA-256 算法对步骤 1 的结果进行哈希

  3. 3

    Base64 解码您的 api_secret

  4. 4

    使用步骤 3 的结果,通过 HMAC-SHA-512 算法对步骤 2 的结果进行哈希

  5. 5

    Base64 编码步骤 4 的结果

示例

以下展示了 Java 中 authent 的实现。有关不同编程语言的完整工作示例,请参阅其他资源部分。 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();
}

需要更多帮助吗?