Go 签名Coinbase请求时签名无效,为什么?

Go 签名Coinbase请求时签名无效,为什么?,go,coinbase-api,Go,Coinbase Api,根据: CB-ACCESS-SIGN报头是通过使用预灰化字符串时间戳上的base64解码密钥创建sha256 HMAC生成的+ 方法+请求路径+正文(其中+表示字符串连接) 和base64对输出进行编码。时间戳值与 CB-ACCESS-TIMESTAMP报头 正文是请求正文字符串,如果没有请求,则省略 正文(通常用于GET请求) 方法应该是大写的 我从一个更好的程序员那里借用了一个签名函数,并提供了如下内容: 1619383731POST/reports{{"end_date"

根据:

CB-ACCESS-SIGN报头是通过使用预灰化字符串时间戳上的base64解码密钥创建sha256 HMAC生成的+ 方法+请求路径+正文(其中+表示字符串连接) 和base64对输出进行编码。时间戳值与 CB-ACCESS-TIMESTAMP报头

正文是请求正文字符串,如果没有请求,则省略 正文(通常用于GET请求)

方法应该是大写的

我从一个更好的程序员那里借用了一个签名函数,并提供了如下内容:

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