Node.js调用Coinbase V2 REST接口返回无效签名问题排查求助
Coinbase V2 REST接口无效签名错误修复方案
核心问题点
- 缺少必填的
CB-VERSION请求头:Coinbase V2 API强制要求所有请求携带该头,取值为YYYY-MM-DD格式的API版本号,建议使用近期正式版本如2022-10-01,缺失该参数会直接触发签名校验失败。 - 本地时钟与服务端时间偏差过大:签名依赖的Unix时间戳和Coinbase服务器时间差不能超过30秒,需确保本地设备时钟和NTP服务同步。
- API密钥配置错误:需确认使用的是Coinbase普通版(非Pro/Advanced Trade)的API密钥,且创建密钥时已经勾选了对应接口的访问权限(如调用
/v2/user需要开启用户读取权限)。 - 签名用参数与实际请求不一致:后续使用带查询参数的GET请求时,签名用的path需要包含完整查询字符串;POST请求的签名用body必须和实际发送的请求体完全一致,不能有额外空格或格式差异。
修正后代码
const { createHmac } = require('crypto'); const axios = require('axios'); (async () => { const cbApiKey = 'xxx'; const apiSecret = 'xxx'; const method = 'GET'; const path = '/v2/user'; const body = ''; const timestamp = Math.floor(new Date().getTime() * 1e-3); const message = timestamp + method + path + body; const key = Buffer.from(apiSecret, 'base64'); const cbAccessSign = createHmac('sha256', key).update(message).digest('base64'); const instance = axios.create(); try { const user = await instance.request({ method, url: `https://api.coinbase.com${path}`, headers: { 'CB-ACCESS-KEY': `${cbApiKey}`, 'CB-ACCESS-SIGN': `${cbAccessSign}`, 'CB-ACCESS-TIMESTAMP': `${timestamp}`, 'CB-VERSION': '2022-10-01', "Content-Type": 'application/json', }, }); console.log(user.data); } catch (error) { console.log(error.response?.data || error.message); } })();
内容的提问来源于stack exchange,提问作者user1791139
相关产品推荐
相关产品推荐

