穆晶波 2025-05-01 07:15 采纳率: 98.6%
浏览 12
已采纳

OKX API返回Unauthorized,可能是签名错误或APIKey配置不当导致的。如何排查与解决此问题?

**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是否正确填写。以下是具体步骤:

    1. 登录OKX账户,进入API管理页面,确保复制的API Key、Secret Key和Passphrase与代码中使用的完全一致。
    2. 检查API Key的权限设置,确保启用了“交易”或“提现”权限(根据实际需求)。
    3. 尝试重新生成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时间戳
    methodHTTP请求方法(如GET、POST)
    requestPathAPI请求路径(如/v5/account/balance)
    body请求体(JSON格式字符串,若无则为空字符串)

    签名字符串按timestamp+method+requestPath+body顺序拼接,并使用HMAC SHA256加密,最后转为大写十六进制格式。

    4. 请求头配置

    确保请求头包含以下关键字段:

    • OK-ACCESS-KEY: API Key
    • OK-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[更换网络环境];
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 5月1日