调用Kraken REST API时出现EAPI:Invalid signature错误求助
Kraken API "EAPI:Invalid signature" 错误排查及私有接口疑问解答
一、"EAPI:Invalid signature" 错误排查
咱们一步步拆解你的代码问题,核心问题出在签名生成环节,还有几个细节需要修正:
- 签名返回值错误(最关键):你在
getMessageSignature函数最后返回的是hmac对象本身,但Kraken要求的是计算完成的base64格式签名字符串,也就是你已经算好的hmac_digest。把return hmac;改成return hmac_digest;,这是导致签名无效的核心原因。 - 前端环境依赖不兼容:你用了
require('crypto')和require('qs'),这俩是Node.js专属模块,如果你的代码是在浏览器里跑(因为用了jQuery的$.ajax),浏览器不支持require语法,也没有内置crypto模块。解决办法是:- 用
crypto-js这类浏览器兼容的加密库替代Node.js的crypto - 引入
qs的浏览器版本,或者用原生URLSearchParams序列化参数(注意要按参数名字母顺序排序,Kraken要求的)
- 用
- Nonce类型转换问题:计算哈希时你直接用
nonce + message,这里nonce是数字类型,直接拼接可能出现隐式转换异常,最好显式转成字符串:nonce.toString() + message - 参数序列化一致性:确保签名里的
message和你实际POST的参数完全一致。Kraken要求参数按字母顺序排序后序列化,qs.stringify默认会按键名排序,这点没问题,但要确认没有额外参数混入请求数据里。
修正后的getMessageSignature函数(Node.js环境下)示例:
function getMessageSignature(path, request, secret, nonce){ const crypto = require('crypto'); var qs = require('qs'); // 把nonce转为字符串避免类型问题 const nonceStr = nonce.toString(); // 强制按参数名排序序列化,符合Kraken要求 const message = qs.stringify(request, { sort: (a, b) => a.localeCompare(b) }); const secretBuffer = Buffer.from(secret, 'base64'); const hash = crypto.createHash('sha256'); const hashDigest = hash.update(nonceStr + message).digest('binary'); const hmac = crypto.createHmac('sha512', secretBuffer); const hmacDigest = hmac.update(path + hashDigest, 'binary').digest('base64'); return hmacDigest; // 返回正确的签名字符串 }
二、调用Kraken私有接口是否要求账户有资金?
完全不需要。只要你的API密钥拥有对应接口的权限(比如调用DepositMethods需要开启Deposit权限),哪怕账户里一分钱都没有,也能正常调用这类查询性质的私有接口。像getDepositMethods只是返回你的账户支持的存款方式,和账户余额无关。
内容的提问来源于stack exchange,提问作者Oscar Ordoñez
相关产品推荐
相关产品推荐

