我无法成功验证Trello发出的Webhook请求。这就是我所知道的。
Trello的webhook文档here指出:
这是可以理解的。他们继续说
这对我来说还不太清楚。我的理解是,有效负载的每个字符(body + callbackURL)已放入8位整数中,而忽略了溢出。 (因为8211 == 0b10000000010011和0b00010011 == 19)这是我认为问题所在。
我用来解决Trello的节点有效载荷问题的函数是:
func bitShift(s string) []byte {
var byteString []byte
// For each rune in the string
for _, c := range s {
// Create a byte slice
b := []byte(string(c))
// Take the sign off the least significant byte
tmp := b[len(b)-1] << 1
tmp = tmp >> 1
// Append it to the byte string
byteString = append(byteString, tmp)
}
return byteString
}
我也有可能在基本验证步骤中做错了什么。尽管我对此有些陌生,但对我来说似乎还可以。
// VerifyNotificationHeader ...
func VerifyNotificationHeader(signedHeader, trelloAPISecret string, requestURL *url.URL, body []byte) bool {
// Put callbackURL and body into byte slice
urlBytes := bitShift(requestURL.String())
bitBody := bitShift(string(body))
// Sign, hash, and encode the payload
secret := []byte(trelloAPISecret)
keyHMAC := hmac.New(sha1.New, secret)
keyHMAC.Write(append(bitBody, urlBytes...))
signedHMAC := keyHMAC.Sum(nil)
base64signedHMAC := base64.StdEncoding.EncodeToString(signedHMAC)
if comp := strings.EqualFold(base64signedHMAC, signedHeader); !comp {
return false
}
return true
}
让我知道您是否需要更多信息。谢谢!
更新:已解决,请查看答案。
最佳答案
为什么要扔掉MSB?您正在将每个rune
转换为byte
,这是无符号的(实际上是uint8
的别名),因此该位保留了丢失的信息。
您可以考虑改用这样的函数:
func ascii(s string) []byte {
var ret []byte
for _, r := range s {
ret = append(ret, byte(r))
}
return ret
}
由于
rune
是int32
的别名,因此对byte
的强制转换只会删除前24位,这就是您想要的。(注意:这假定为低端字节序。)
关于security - 验证Trello Webhook签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34209823/