You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js调用Coinspot API发POST请求返回401错误该如何解决?

问题原因排查

你的代码存在3个核心错误,直接导致401鉴权失败:

    1. HMAC签名的参数顺序完全颠倒:HMAC-SHA512签名规则是用secret作为密钥,对POST数据内容做签名,你的getSecurePassword函数调用时,把secret和待签名的postdata位置传反了,同时函数内部的HMAC初始化逻辑也对应错误。
    1. nonce和postdata定义在全局作用域:每次调用接口都复用同一个nonce值,不符合nonce必须逐次递增的要求,第一次请求后后续所有请求都会因为nonce无效被拒绝。
    1. 未显式指定请求头的Content-Type:Coinspot API要求POST请求体为JSON格式,缺少声明会导致服务端解析参数失败,签名校验不通过。

修正后的可运行代码

const axios = require("axios");
const n = require("nonce")();
const crypto = require("crypto");

const api_key = process.env.COINSPOT_KEY;
const api_secret = process.env.COINSPOT_SECRET;

// 修正签名函数:参数1是待签名内容,参数2是签名密钥,参数3是算法
function generateSignature(payload, secret, algo) {
  const algoFormatted = algo.toLowerCase().replace("-", "");
  const hmac = crypto.createHmac(algoFormatted, secret);
  hmac.update(payload);
  return hmac.digest("hex");
}

exports.orderHistory = async (req, res) => {
  // 每次请求生成新的nonce和postdata,保证nonce逐次递增
  const nonce = n();
  const postdata = { nonce: nonce };
  const postStr = JSON.stringify(postdata);
  // 生成正确的签名
  const sign = generateSignature(postStr, api_secret, "SHA-512");
  try {
    const response = await axios({
      baseURL: "https://www.coinspot.com.au/api/v2/ro",
      url: "my/orders/completed",
      method: "post",
      data: postdata,
      headers: {
        'key': api_key,
        'sign': sign,
        'Content-Type': 'application/json'
      }
    });
    res.json(response.data);
  } catch (error) {
    // 可打印错误响应内容方便后续排查
    console.log(error.response?.data || error.message);
    res.status(error.response?.status || 500).json(error.response?.data || error.message);
  }
};

额外注意事项

  • 确认你的API密钥已经开通了对应接口的权限,只读接口需要生成只读类型的API Key,交易接口需要开通读写权限
  • 确认系统时间没有偏差过大,服务端通常会校验nonce的生成时间和服务端时间差不能超过5分钟

内容的提问来源于stack exchange,提问作者Wen Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:36:00