【发布时间】:2018-01-02 22:59:50
【问题描述】:
我正在编写一个需要使用 Dropbox 的 webhook 的程序。我还没有找到任何已经到位的 Go 实现,所以我决定编写我的。不幸的是,它似乎不起作用。
我认为这里的问题在于 hmac,因为我很可能做错了什么,但我似乎无法理解这里的问题到底出在哪里。有什么想法吗?
以下是我所拥有的:
package dboxwebhook
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"errors"
"io"
"io/ioutil"
"log"
)
type Signature struct {
AppSecret []byte
Signature []byte
}
func (w *Signature) Check(reqBody io.ReadCloser) error {
if bytes.Compare(w.Signature, nil) == 0 {
return errors.New("DropBox signature doesnt exist")
}
// building HMAC key (https://golang.org/pkg/crypto/hmac/)
mac := hmac.New(sha256.New, w.AppSecret)
requestBody, err := ioutil.ReadAll(reqBody)
if err != nil {
return err
}
mac.Write(requestBody)
expectedMac := mac.Sum(nil)
log.Println(w.AppSecret)
log.Println(expectedMac)
log.Println(w.Signature)
// compare if it corresponds with the signature sent by DropBox
comparison := hmac.Equal(w.Signature, expectedMac)
if !comparison {
return errors.New("Signature Check unsuccessful")
}
return nil
}
要对此进行测试,我知道的唯一方法是使用 Dropbox 中的 this Python script。
【问题讨论】:
-
您是否尝试过记录请求正文以验证它是否与发送的数据匹配?
-
我假设您看到的是“签名检查不成功”?另一个随机猜测:标头中的签名将是十六进制编码的,因此请确保无论您在何处解析它,都正确执行。如果您提供示例输入和您正在计算的哈希值,这个问题会更容易回答,因为错误可能出现在很多地方。
-
w.Signature是 DropBox 发送的十六进制编码密钥。就我而言,根据 DropBox 的文档,我应该使用我的 secret 字符串作为密钥对正在发送的请求正文进行编码。然后我需要比较这两个值并确保它们相同。但是,目前它们不是。 -
如果您要比较的签名是十六进制编码的,那么您还需要对您计算的签名进行十六进制编码。看起来你没有这样做。
-
不是
expectedMac十六进制编码吗?我做错了什么?
标签: go dropbox-api hmac sha256 webhooks