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

Coinbase Pro API签名无效问题排查求助

解决Coinbase Pro沙箱API签名无效问题

我仔细看了你的代码、请求细节和错误响应,发现几个关键问题导致了invalid signature错误,逐个给你拆解分析:

1. Secret Key处理方式错误

你当前代码里把Base64解码后的Buffer转成了字符串:

var key = (Buffer.from(this.secretKey, 'base64')).toString();

但CryptoJS的HmacSHA256需要的是原始二进制密钥,而非UTF-8字符串。将Buffer转字符串时,部分字节可能被错误解析,直接破坏了密钥的有效性。正确的做法是用CryptoJS自身的Base64解析方法,直接获取二进制密钥:

var key = CryptoJS.enc.Base64.parse(this.secretKey);

不需要借助Node.js的Buffer,CryptoJS原生处理更适配自身的加密逻辑。

2. Timestamp不匹配

你的请求头CB-ACCESS-TIMESTAMP是1558378899,但服务器返回的Epoch时间是1558378898.711。Coinbase要求签名时使用的timestamp必须和请求头的CB-ACCESS-TIMESTAMP完全一致,且这个时间戳需为UNIX时间戳的秒数(可保留小数,但通常取整数部分)。

请确保:

  • 生成签名时传入的timestamp参数和请求头的CB-ACCESS-TIMESTAMP完全相同
  • 建议直接使用服务器返回的Epoch整数部分1558378898,而非四舍五入后的1558378899

3. Request Path格式错误

官方文档里的requestPath特指API的路径部分(不含域名、协议),比如你请求的完整URL是https://api-public.sandbox.pro.coinbase.com/accounts,正确的requestPath应该是/accounts。

检查你传入generateSignaturePro的resourceUrl参数,如果是完整URL,预哈希字符串会包含多余的域名信息,直接导致签名不匹配。需要提取纯路径部分传入方法。

4. GET请求的Request Body处理

GET请求没有请求体,所以requestBody必须是空字符串""。请确认调用generateSignaturePro时确实传入了空字符串,而非undefined或其他值。

修正后的代码示例

把上述问题修复后,你的签名生成方法应该是这样:

private generateSignaturePro(timestamp: string, method: string, requestPath: string, requestBody: string = ""): string {
  // 拼接预哈希字符串,注意method转大写
  const prehash = timestamp + method.toUpperCase() + requestPath + requestBody;
  // 用CryptoJS解析Base64密钥
  const key = CryptoJS.enc.Base64.parse(this.secretKey);
  // 生成HMAC SHA256并转Base64
  const hmac = CryptoJS.HmacSHA256(prehash, key);
  return CryptoJS.enc.Base64.stringify(hmac);
}

额外建议把method转成大写(比如GET),严格对齐Coinbase的签名规则,避免大小写差异导致的问题。

额外检查点

  • 确认passPhrase、publicKey和secretKey都是沙箱环境的密钥,没有混用生产环境的凭证
  • 检查请求头里的CB-ACCESS-SIGN是否是你生成的签名,无拼写错误
  • 确保timestamp和服务器时间的误差在30秒以内,Coinbase会拒绝超时请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:43:58