**OKX API返回Unauthorized的排查与解决**
当使用OKX API时,若返回“Unauthorized”错误,通常是签名错误或API Key配置不当导致。首先,确认API Key、Secret Key和Passphrase是否正确填写,并检查是否启用“交易”或“提现”权限。其次,时间戳需与OKX服务器时间同步,偏差超过30秒可能导致签名失败。建议在请求中使用当前UTC时间戳(毫秒级)。
此外,签名生成时需按`timestamp+method+requestPath+body`顺序拼接字符串,并用HMAC SHA256加密,最后转为大写十六进制格式。确保请求头正确包含`OK-ACCESS-KEY`、`OK-ACCESS-SIGN`、`OK-ACCESS-TIMESTAMP`和`OK-ACCESS-PASSPHRASE`。
如问题仍未解决,可尝试更换网络环境,避免代理或防火墙干扰。最后,参考官方文档示例代码,逐步对比排查。
1条回答 默认 最新
扶余城里小老二 2025-05-01 07:15关注1. 初步排查:API Key配置检查
当OKX API返回“Unauthorized”错误时,首先需要确认API Key、Secret Key和Passphrase是否正确填写。以下是具体步骤:
- 登录OKX账户,进入API管理页面,确保复制的API Key、Secret Key和Passphrase与代码中使用的完全一致。
- 检查API Key的权限设置,确保启用了“交易”或“提现”权限(根据实际需求)。
- 尝试重新生成API Key和Secret Key,避免密钥可能被泄露或损坏的情况。
此外,还需注意API Key的有效期和使用限制,避免因过期或超出限制导致问题。
2. 时间戳同步问题
时间戳是API签名的重要组成部分,时间偏差可能导致签名验证失败。以下是解决方案:
- 确保本地时间与OKX服务器时间同步,偏差应小于30秒。
- 在请求中使用当前UTC时间戳(毫秒级),例如:
Math.floor(Date.now() / 1000)。 - 如果不确定服务器时间,可以先通过调用OKX的时间接口获取准确时间,然后调整本地时间戳。
// 获取当前UTC时间戳 const timestamp = new Date().toISOString();3. 签名生成逻辑
签名生成是API请求的核心部分,需严格遵循以下规则:
参数 说明 timestamp 当前UTC时间戳 method HTTP请求方法(如GET、POST) requestPath API请求路径(如/v5/account/balance) body 请求体(JSON格式字符串,若无则为空字符串) 签名字符串按
timestamp+method+requestPath+body顺序拼接,并使用HMAC SHA256加密,最后转为大写十六进制格式。4. 请求头配置
确保请求头包含以下关键字段:
OK-ACCESS-KEY: API KeyOK-ACCESS-SIGN: 签名结果OK-ACCESS-TIMESTAMP: 当前UTC时间戳OK-ACCESS-PASSPHRASE: Passphrase
示例代码如下:
const headers = { 'OK-ACCESS-KEY': apiKey, 'OK-ACCESS-SIGN': sign, 'OK-ACCESS-TIMESTAMP': timestamp, 'OK-ACCESS-PASSPHRASE': passphrase, };5. 网络环境与防火墙
网络环境也可能导致“Unauthorized”错误,建议:
- 更换网络环境,避免代理或防火墙干扰。
- 确保请求IP地址在OKX后台的白名单中。
如果仍然无法解决,可以参考官方文档中的示例代码逐步对比排查。
6. 排查流程图
以下是完整的排查流程图:
graph TD; A[开始] --> B{API Key配置正确?}; B -- 是 --> C{时间戳同步?}; B -- 否 --> D[检查API Key]; C -- 是 --> E{签名生成正确?}; C -- 否 --> F[调整时间戳]; E -- 是 --> G{请求头配置正确?}; E -- 否 --> H[检查签名逻辑]; G -- 是 --> I{网络环境正常?}; G -- 否 --> J[检查请求头]; I -- 否 --> K[更换网络环境];本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报