Deribit 的 API 对所有人使用 OAuth 2.0 风格的身份验证 私人 API 请求。这意味着你必须获得 访问令牌 (以及随附的 刷新令牌) 在调用私有端点之前使用您的 API 密钥证书。公共 API 方法(市场数据等) 不需要身份验证,但是经过身份验证的连接具有更高的值 速率限制 和更多功能(原始活动提要)。
本指南介绍如何设置 API 密钥、使用 Deribit API 进行身份验证、管理令牌(包括 fork_token 用法),并处理不同权限级别的访问范围。
在进行身份验证之前,请在您的 Deribit 账户中创建 API 密钥。你可以选择其中一个 Deribit 生成的密钥 (对于 客户端 ID/秘密 凭证(身份验证)或 自生密钥 (用于非对称签名认证)。
提示
有关生成 API 密钥的详细步骤,请参阅 Deribit 在 Deribit 上创建新的 API 密钥 和 非对称 API 密钥 文章。
Deribit API 中的某些私有方法(例如提款或与安全相关的账户操作)需要 双因素身份验证 (2FA)。如果您的账户启用了双重身份验证,则在通过 API 调用这些方法时必须提供第二个因素
注意
没有必要 2FA 确认的 API 请求将被拒绝,并显示错误 security_key_authorization_error (代码:13668)。务必确保您的应用程序流程支持在需要时发送第二个因子。
-
参见 API 文档中的安全密钥部分 了解有关使用 2FA 或硬件密钥确认操作的技术细节。
-
要在您的账户中启用和管理 2FA,请按照中的步骤操作 双因素身份验证文章。
Deribit 的主要身份验证端点是 公共/身份验证。调用此函数将返回一个包含 JSON 对象 access_token 还有一个 refresh_token,以及其他领域。 三种补助类型 你可以在打电话时使用 公共/身份验证:
-
客户证书: 使用你的 客户端 ID 和 客户机密 直接获取令牌(适用于服务器到服务器 API 的使用)。这是最简单的方法——你提供
grant_type=client_credentials,还有你的client_id和client_secret。 -
客户签名: 使用加密签名而不是发送密钥。使用您的客户端密钥作为密钥,您可以为包含时间戳、随机随机数和可选数据的字符串生成 HMAC-SHA256 签名。这种方法(通常用于 非对称 API 密钥) 需要
grant_type=client_signature,而且你必须提供client_id,timestamp(以毫秒为单位的当前时间),nonce,signature,以及(如果需要的话)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 beclient_signature -
[en]
client_idandclient_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_token 和 refresh_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 ... 标题。
这些方法无需事先发出令牌请求,但通常用于高级场景或不想单独处理令牌刷新时使用。大多数开发人员发现它最容易使用 公共/身份验证 获取持有者令牌并将其用于后续调用。