產生身分驗證字串(REST API)

最近一次更新: 2026年10月7日

部分 REST API端點支援敏感操作,例如下單或申請數位資產提款。這些私有 API端點只能透過加密請求呼叫,且每個請求均須包含身分驗證字串(authent)。authent 由以下輸入計算得出:

PostData

postData 是以「&」符號串聯的字串,格式為 =,各 REST API端點各有不同。

示例

如需呼叫 orderbook API端點,請選擇參數 symbol,並將其值設為
fi_xbtusd_180615。此時 postData 即為 symbol=fi_xbtusd_180615。

更新 v3 API端點的身分驗證流程:自 2024 年 2 月 20 日起,為符合最佳實踐並提升安全標準,我們將更新 /derivatives/*(v3)API端點的身分驗證流程。(詳情見下文)

PostData 生成方式變更:


- 更新前:生成 Authent 時,客戶須在進行 url 編碼前先對查詢字串參數進行哈希處理,例如 `greeting=hello world`。


- 更新後:身分驗證流程現要求對請求中完整的 url 編碼 URI 組件進行哈希處理,例如 `greeting=hello%20world`。此方式可提升安全性,並符合最佳實踐。
此更新對 v3 batchorder API端點尤為重要,該端點在查詢參數中接受 JSON 主體。


向下相容性及未來計劃:


目前,此變更具備向下相容性,平台將同時接受上述兩種 PostData 生成方式。惟我們計劃在未來逐步淘汰舊方式(即對已解碼的查詢字串參數進行哈希處理),以維持最高安全標準。我們將提前發出充分通知,並強烈建議所有客戶盡快切換至新方式,確保服務不受影響。

隨機數(Nonce)

隨機數(nonce)是一個持續遞增的整數參數。建議以毫秒為單位的系統時間(字串格式)作為隨機數。
我們的系統可在短時間內容忍亂序的隨機數。隨機數並非必填。

範例 1415957147987

許多身分驗證問題均源於隨機數不正確。重新生成一組 API 金鑰將自動重置隨機數,從而解決相關問題。

API端點路徑

endpointPath 是 API端點的 URL 路徑延伸部分。

範例 /api/v3/orderbook

API Secret

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();
}