我無法成功驗證來自Trello的webhook請求。這是我所知道的。驗證Trello Webhook簽名
Trello的網絡掛接文件here狀態:
每個網絡掛接觸發器包含HTTP標頭X-Trello - 網絡掛接。標題是HMAC-SHA1哈希的base64摘要。散列的內容是完整請求主體和callbackURL的鏈接,完全像在webhook創建期間提供的一樣。用於簽署此文本的密鑰是您的應用程序的祕密。
這是可以理解的。他們繼續說
由於節點中加密實用程序的某些默認設置,我們簽名的有效內容被視爲二進制字符串,而不是utf-8。例如,如果你使用連字符(U + 2013或8211,十進制),並在Node中創建二進制緩衝區,它將顯示爲[19]的緩衝區,它是8個最不重要的這是在摘要中用於計算SHA-1的值。
這對我來說不太清楚。我的理解是,有效負載的每個字符(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
}
讓我知道你是否需要任何更多的信息。謝謝!
更新:已解決,請查看答案。
您是否有我們可以匹配的示例請求和簽名? – JimB
感謝您的關注!如果在第二天或第二天我無法正常工作,我將添加測試這些功能所需的所有信息。目前,我不願意創建一個新的Trello帳戶,只是爲了在這裏分享這個祕密。 – doykle