Node.js调用Coinspot API发POST请求返回401错误该如何解决?
问题原因排查
你的代码存在3个核心错误,直接导致401鉴权失败:
- HMAC签名的参数顺序完全颠倒:HMAC-SHA512签名规则是用secret作为密钥,对POST数据内容做签名,你的
getSecurePassword函数调用时,把secret和待签名的postdata位置传反了,同时函数内部的HMAC初始化逻辑也对应错误。
- HMAC签名的参数顺序完全颠倒:HMAC-SHA512签名规则是用secret作为密钥,对POST数据内容做签名,你的
- nonce和postdata定义在全局作用域:每次调用接口都复用同一个nonce值,不符合nonce必须逐次递增的要求,第一次请求后后续所有请求都会因为nonce无效被拒绝。
- 未显式指定请求头的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
相关产品推荐
相关产品推荐

