Go 签名Coinbase请求时签名无效,为什么?
根据: CB-ACCESS-SIGN报头是通过使用预灰化字符串时间戳上的base64解码密钥创建sha256 HMAC生成的+ 方法+请求路径+正文(其中+表示字符串连接) 和base64对输出进行编码。时间戳值与 CB-ACCESS-TIMESTAMP报头 正文是请求正文字符串,如果没有请求,则省略 正文(通常用于GET请求) 方法应该是大写的 我从一个更好的程序员那里借用了一个签名函数,并提供了如下内容:Go 签名Coinbase请求时签名无效,为什么?,go,coinbase-api,Go,Coinbase Api,根据: CB-ACCESS-SIGN报头是通过使用预灰化字符串时间戳上的base64解码密钥创建sha256 HMAC生成的+ 方法+请求路径+正文(其中+表示字符串连接) 和base64对输出进行编码。时间戳值与 CB-ACCESS-TIMESTAMP报头 正文是请求正文字符串,如果没有请求,则省略 正文(通常用于GET请求) 方法应该是大写的 我从一个更好的程序员那里借用了一个签名函数,并提供了如下内容: 1619383731POST/reports{{"end_date"
1619383731POST/reports{{"end_date":"2021-01-02T11:59:59Z","start_date":"2020-01-01T00:00:00Z","type":"account"}}
但是继续从Coinbase获取无效签名
签名功能供参考:
// sign
func (e *exchange) sign(msg string) string {
key, err := base64.StdEncoding.DecodeString(e.http.secret)
if e.checkErr(err) {
return "bad_sig"
}
signature := hmac.New(sha256.New, key)
_, err = signature.Write([]byte(msg))
if e.checkErr(err) {
return "bad_sig"
}
return base64.StdEncoding.EncodeToString(signature.Sum(nil))
}
我在哪里搞砸了?你有没有检查过go coinbase github回购协议,它实现了以下功能:
事实证明,直接使用
req.Body
是罪魁祸首。为什么我不知道,还有一些事情我需要弄清楚,但是读入一个[]字节,然后转换成一个字符串可以解决部分问题。是的,这就是我从.msg:=fmt.Sprintf借用符号函数的地方(“%s%s%s%s”,timestamp,e.req.Method,e.req.URL.Path,e.req.Body,)——生成Coinbase要求的内容,所以我不知道为什么签名会被拒绝。
h := make(map[string]string)
h["CB-ACCESS-KEY"] = c.Key
h["CB-ACCESS-PASSPHRASE"] = c.Passphrase
h["CB-ACCESS-TIMESTAMP"] = timestamp
message := fmt.Sprintf(
"%s%s%s%s",
timestamp,
method,
url,
data,
)
sig, err := generateSig(message, c.Secret)
if err != nil {
return nil, err
}
h["CB-ACCESS-SIGN"] = sig
return h, nil