API 身份验证指南

  • 更新

Deribit 的 API 对所有人使用 OAuth 2.0 风格的身份验证 私人 API 请求。这意味着你必须获得 访问令牌 (以及随附的 刷新令牌) 在调用私有端点之前使用您的 API 密钥证书。公共 API 方法(市场数据等) 不需要身份验证,但是经过身份验证的连接具有更高的值 速率限制 和更多功能(原始活动提要)。

本指南介绍如何设置 API 密钥、使用 Deribit API 进行身份验证、管理令牌(包括 fork_token 用法),并处理不同权限级别的访问范围。

创建和管理 API 密钥

在进行身份验证之前,请在您的 Deribit 账户中创建 API 密钥。你可以选择其中一个 Deribit 生成的密钥 (对于 客户端 ID/秘密 凭证(身份验证)或 自生密钥 (用于非对称签名认证)。

提示

有关生成 API 密钥的详细步骤,请参阅 Deribit 在 Deribit 上创建新的 API 密钥非对称 API 密钥 文章。

使用 API 进行双因素身份验证

Deribit API 中的某些私有方法(例如提款或与安全相关的账户操作)需要 双因素身份验证 (2FA)。如果您的账户启用了双重身份验证,则在通过 API 调用这些方法时必须提供第二个因素

注意

没有必要 2FA 确认的 API 请求将被拒绝,并显示错误 security_key_authorization_error (代码:13668)。务必确保您的应用程序流程支持在需要时发送第二个因子。

身份验证方法

Deribit 的主要身份验证端点是 公共/身份验证。调用此函数将返回一个包含 JSON 对象 access_token 还有一个 refresh_token,以及其他领域。 三种补助类型 你可以在打电话时使用 公共/身份验证:

  • 客户证书: 使用你的 客户端 ID客户机密 直接获取令牌(适用于服务器到服务器 API 的使用)。这是最简单的方法——你提供 grant_type=client_credentials,还有你的 client_idclient_secret

  • 客户签名: 使用加密签名而不是发送密钥。使用您的客户端密钥作为密钥,您可以为包含时间戳、随机随机数和可选数据的字符串生成 HMAC-SHA256 签名。这种方法(通常用于 非对称 API 密钥) 需要 grant_type=client_signature,而且你必须提供 client_idtimestamp (以毫秒为单位的当前时间), noncesignature,以及(如果需要的话) data 领域。Deribit 会验证签名,而不是要求原始机密。(有关确切的签名公式,请参阅官方文档,或 非对称 API 密钥指南 用于为该方法设置密钥。)

  • 刷新代币: 使用之前获得的 refresh_token 获取新的访问令牌。 grant_type=refresh_token 并提供 refresh_token 价值。这会返回一个新的 access_token (以及新的刷新令牌),无需再次使用客户端密钥即可延长会话。

客户证书

示例-客户凭证流程: 以下是使用客户端凭证的示例请求和响应结构:

GET /api/v2/public/auth?grant_type=client_credentials&client_id=<YOUR_CLIENT_ID>&client_secret=<YOUR_CLIENT_SECRET>

成功后,您将收到 JSON 响应,例如:

{
 “jsonrpc”:“2.0”,
 “id”:1,
 “结果”:{
 “access_token”:“1582628593469.1mbq-j_4.cbp-oqow... uARM”, 
 “expires_in”:31536000,
 “refresh_token”:“1582628593469.1gp4rqd0.a9wa78... a9jm”,
 “范围”:“连接主账户”,
 “token_type”:“持有者”
 }

access_token 是一个长字符串(上面已截断),用于对后续请求进行身份验证。expires_in 字段(以秒为单位)告诉您令牌的有效期限,并且可以存储 refresh_token 以在需要时续订访问权限。范围显示了该令牌的授予访问范围(有关范围的更多信息见下文),token_type 将是 “

使用代币: 获得访问令牌后,必须将其包含在任何令牌中 私有 API 请求。如何包含它取决于连接类型:

  • HTTP REST 请求: 在 HTTP 授权标头中包含令牌:

    Authorization: Bearer <access_token>.

  • WebSocket (JSON-RPC) 请求: 将令牌作为参数包含在每个 JSON 请求中:例如,私有方法的 “params”: {“access_token”: "<access_token>“,...}。如果您使用 WebSocket 连接进行身份验证 会话 代币(参见 连接管理-最佳实践),服务器会记住你的令牌,允许你在后续的请求中省略该令牌 相同 WebSocket 连接。

提示

安全地管理您的代币: 如果您需要长期访问权限,请存储刷新令牌,并将访问令牌视为密码(切勿公开它们)。

客户签名

客户签名认证

要执行 客户签名 身份验证:

1。准备组件:

  • [en] grant_type – Must be client_signature

  • [en] client_id and client_secret – Can be found on the API page on the Deribit website after creating the API key

  • [en] timestamp – Time when the request was generated, given as milliseconds. It is valid for 60 seconds since generation; after that, any request with an old timestamp will be rejected

  • [en] signature – Value for the signature calculated as described below

  • [en] nonce – Single-use, user-generated initialization vector for the server token

  • [en] data – Optional field, which contains any user-specific value

2。生成待签字符串:

Deribit 的客户端签名流程签署了一个非常具体的字节序列。 HMAC‑SHA256 和你的 客户机密 作为密钥并对摘要进行十六进制编码。

公式:

StringToSign = Timestamp + "\n" + Nonce + "\n" + Data
Signature    = HEX_STRING( HMAC-SHA256( ClientSecret, StringToSign ) )

重要细节

  • 务必包括 两个换行符 如上所示。

    如果省略数据,则将其视为空字符串,因此该字符串在 Nonce 之后仍以\n 结尾。

  • 对所有字符串使用 UTF-8。

  • 发送 小写十六进制 将 HMAC 作为签名。

  • 时间戳是自纪元以来的毫秒。每个请求的随机数应该是唯一的。

Shell (OpenSSL) 单行

通用格式,适用于 Linux 和 macOS:

ClientId="YOUR_CLIENT_ID"
ClientSecret="YOUR_CLIENT_SECRET"

Timestamp="$(date +%s000)"                          # ms since epoch; on macOS this is fine
Nonce="$(LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c8)"
Data=""                                             # or some context string

Signature="$(
  printf "%s\n%s\n%s" "$Timestamp" "$Nonce" "$Data" \
  | openssl dgst -sha256 -hmac "$ClientSecret" -r \
  | cut -d' ' -f1
)"
echo "$Signature"

示例

ClientId=AMANDA
ClientSecret=AMANDASECRECT
Timestamp=1576074319000
Nonce=1iqt2wls
Data=""

Signature="$(
  printf "%s\n%s\n%s" "$Timestamp" "$Nonce" "$Data" \
  | openssl dgst -sha256 -hmac "$ClientSecret" -r \
  | cut -d' ' -f1
)"
echo "$Signature"
# -> 56590594f97921b09b18f166befe0d1319b198bbcdad7ca73382de2f88fe9aa1

3. 发送请求:

致电公众/身份验证 grant_type=client_signature 并包括:

  • client_id

  • timestamp

  • nonce

  • signature (你计算出的 HMAC)

  • data (如果在签名中使用)

使用之前计算的值对 JSON-RPC 请求进行示例:

{
  "jsonrpc": "2.0",
  "id": 9929,
  "method": "public/auth",
  "params": {
    "grant_type": "client_signature",
    "client_id": "AMANDA",
    "timestamp": 1576074319000,
    "nonce": "1iqt2wls",
    "data": "",
    "signature": "56590594f97921b09b18f166befe0d1319b198bbcdad7ca73382de2f88fe9aa1"
  }
}

成功后,服务器返回 access_tokenrefresh_token,与客户端凭证身份验证相同。

您还可以使用以下 Python 代码自动生成签名并在测试环境中完成身份验证过程

import datetime
import random
import string
import hashlib
import hmac
import requests
from datetime import datetime

ClientId = ""
clientSecret = ""
Timestamp = round(datetime.now().timestamp() * 1000)
Nonce = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(8))
data = ""

def calcSignature(method, uri, secret, timestamp, nonce, body):
    requestData = f'{method}\n{uri}\n{body}\n'
    message = f'{timestamp}\n{nonce}\n{requestData}'
    return hmac.new(
        bytes(secret, "ascii"),  # Changed to 'utf-8'
        msg=bytes(message, "utf-8"),  # Changed to 'utf-8'
        digestmod=hashlib.sha256
    ).hexdigest().lower()

Signature = calcSignature("GET", "/api/v2/private/get_account_summary?currency=BTC&extended=true", clientSecret, Timestamp, Nonce, data)

headers = {
    'Authorization': f'deri-hmac-sha256 id={ClientId},ts={Timestamp},nonce={Nonce},sig={Signature}',
    'Content-Type': 'application/json'  # Added Content-Type header
}

response = requests.get(
    "https://test.deribit.com/api/v2/private/get_account_summary?currency=BTC&extended=true", 
    headers=headers
)

print(response.json())
print(ClientId, Timestamp, Nonce, Signature)

刷新代币

当您使用进行身份验证时 公共/身份验证 (使用客户凭证或客户签名),响应中同时包含 access_token 还有一个 refresh_token

  • access_token – used to authorize your API calls (via Authorization: Bearer <token> in HTTP or as access_token in WebSocket requests).

  • refresh_token — 用于在当前访问令牌到期后获取新的访问令牌。

为什么要使用刷新令牌?

访问令牌的生命周期有限(定义在 expires_in 字段)。您可以致电,而不是每次都重新提供您的客户端 ID 和客户密钥 公共/身份验证 再说一遍 grant_type=refresh_token 以及您存储的刷新令牌。这样可以安全地延长会话时间,而不会暴露您的证书

示例:
{
  "method": "public/auth",
  "params": {
    "grant_type": "refresh_token",
    "refresh_token": "<1756301374726.1R2lPbsF.Q_Oqe7J-NpqHhhVV46NHvJuaidr5S1e3pdaO9pAvUoPmJFnSU9faJqxSiTp2Q4I_oT8XsiQo3mMu-0wFoqnY80Epz84XmRH-wQaCZ0jJEMFLUWZI-ILtUPMoPwvL9QFxhAX9sw8J-8559qNHjAJ_X3a_oGk8GTmIpEEF6Zenr00VWiPsMWxY17LmQf6xXd5q4kHk7cLsyoTSv76qrP-260xsshwomb6iJ7SMdTQYlG1D69mBBr1q_ECupVoOm0w9Wp0pxC0KSqyalhuNMLcKGFZveCA-pZQ2GH93WQptzVA-Mh0Gcw>"
  }
}

回复中包含一个新的 access_token (还有一个新的 refresh_token)。

会话行为
  • 如果您的令牌是在会话范围内发行的,刷新会使相同的会话保持活动状态,并且不会消耗额外的会话时段。

  • 如果你没有申请 session 作用域,每次刷新都会生成一个新的连接范围令牌并使之前的令牌失效。

最佳实践
  • 请务必确保您的刷新令牌安全。它可以用来铸造新的访问令牌。

  • 在到期前不久实现自动刷新(请查看 expires_in 值)。

  • 如果您的应用程序重新启动,请保留最新的刷新令牌。

分叉和交换代币

分叉代币

可以使用 “克隆” 会话令牌 公共/fork_token 方法。这是一项高级功能,可帮助管理多个会话。 fork_token 从现有的会话范围令牌中获取有效的刷新令牌,并为新会话生成新的访问令牌(使用您指定的名称)。换句话说,它允许您将现有会话分叉到另一个会话 无需重新提供您的客户机密信息。这仅适用于会话范围的令牌(您不能分叉仅限连接的

何时使用分叉代币?

假设您的应用程序已经在一台服务器上进行了身份验证,并且您想使用启动第二个客户端(或子服务) 相同的账户和 API 密钥。您可以从第一次会话中获取刷新令牌并调用,而不必存储客户端密钥或再次要求提供证书 公共/fork_token 创建一个 新的 第二个客户端的会话令牌。新令牌将具有与原始令牌相同的范围(但绑定到不同的会话名称)。两个会话可以在同一 API 密钥下并行运行

交换代币

公共/交易所代币 允许您将刷新令牌转换为其他子账户的新访问令牌。 subject_id 标识目标子账户,因此此方法是在子账户之间切换的标准方式,无需再次发送您的客户端密钥。除非您提供范围覆盖,否则生成的令牌将保持相同的权限。

何时使用交换代币?

您在一个子账户上进行了身份验证,需要使用相同的 API 密钥对另一个子账户进行操作。打电话 公共/交易所代币 和:

  • refresh_token 来自您当前的会话

  • subject_id 目标子账户的

  • 可选的 scope 覆盖范围并设置 session:name 如果你想在交换期间创建会话令牌。新令牌的范围不能超过调用者的权限。

替代身份验证方法

为方便起见,Deribit 还支持 HTTP 请求的两种替代方法: 基本身份验证HMAC 身份验证

With Basic Auth, you can send: Authorization: Basic <base64(client_id:client_secret)> in your HTTP request, and Deribit will authenticate and execute the request in one step. 

HMAC 身份验证 (Deribit 签名证书),您使用您的密钥(如 client_signature 方法)对请求进行签名,并将其包含在 Authorization: deri-hmac-sha256 ... 标题。

这些方法无需事先发出令牌请求,但通常用于高级场景或不想单独处理令牌刷新时使用。大多数开发人员发现它最容易使用 公共/身份验证 获取持有者令牌并将其用于后续调用。

注销

最后,你可以使用注销令牌并使令牌失效 私密/注销 (仅限 WebSocket)(仅限 WebSocket),但通常令牌将在使用后自动过期 expires_in 持续时间。

注意

使用以下方式注销 私密/注销 不会触发 断开连接时取消。除非明确取消,否则任何未完成的订单或报价将保持有效。