Coinbase API调用报invalid_token:仅持API密钥不知如何传Bearer令牌
解决Coinbase API "invalid_token" 错误:API Key/Secret的正确认证方式
你遇到的问题根源在于用错了认证方式:你手里的是API Key和API Secret,但你用了OAuth 2.0的Bearer Token认证头,这两种是完全不同的认证体系,所以Coinbase返回了invalid_token错误。
Coinbase对于API Key/Secret的认证要求是HMAC签名认证,而不是简单的Bearer Token。下面是具体的解决步骤:
1. 理解HMAC签名认证的核心要素
每个请求需要带上这几个关键请求头:
CB-ACCESS-KEY: 你的API KeyCB-ACCESS-SIGN: 基于请求内容生成的HMAC-SHA256签名(十六进制格式)CB-ACCESS-TIMESTAMP: 当前的Unix时间戳(秒级)CB-VERSION: 你已经在用的2015-04-08(这个没问题)
2. 手动生成签名并构造curl请求
在Ubuntu终端里可以分步骤操作:
第一步:获取当前时间戳
TIMESTAMP=$(date +%s)
第二步:构造签名字符串
对于你的GET请求,签名字符串格式是:timestamp + 请求方法 + 请求路径 + 请求体(GET请求的请求体为空,所以最后一部分留空):
SIGN_STRING="${TIMESTAMP}GET/v2/accounts/3e3835d3----/addresses"
第三步:生成HMAC-SHA256签名
用你的API Secret作为密钥,对上面的字符串生成签名并转成十六进制:
API_SECRET="你的API密钥密码" SIGNATURE=$(echo -n "$SIGN_STRING" | openssl dgst -sha256 -hmac "$API_SECRET" | sed 's/^.* //')
第四步:执行正确的curl请求
把生成的参数带入请求头:
curl -k -X GET "https://api.coinbase.com/v2/accounts/3e3835d3----/addresses" \ -H "CB-VERSION: 2015-04-08" \ -H "accept: application/json;charset=utf-8" \ -H "CB-ACCESS-KEY: 你的API密钥" \ -H "CB-ACCESS-TIMESTAMP: $TIMESTAMP" \ -H "CB-ACCESS-SIGN: $SIGNATURE"
3. 注意事项
- 时间戳必须和请求发送时间同步(误差不能超过30秒),否则会报
invalid_timestamp错误 - 签名字符串的拼接必须严格按照
timestamp+method+path+body的顺序,不能有空格或者多余字符 - 如果是POST请求,需要把请求体(JSON格式)也加入到签名字符串中
内容的提问来源于stack exchange,提问作者SMJ
相关产品推荐
相关产品推荐

