我在成功驗證來自 Trello 的 webhook 請求時遇到問題。這是我所知道的。Trello 的 webhook 文檔在這里指出:每個 webhook 觸發器都包含 HTTP 標頭 X-Trello-Webhook。標頭是 HMAC-SHA1 哈希的 base64 摘要。散列內容是完整的請求正文和 callbackURL 的串聯,與在 webhook 創建期間提供的完全一樣。用于簽署此文本的密鑰是您的應用程序的秘密。這是可以理解的。他們接著說由于 node 中加密實用程序的某些默認值,我們簽名的有效負載被視為二進制字符串,而不是 utf-8。例如,如果您使用破折號字符(十進制的 U+2013 或 8211),并在 Node 中用它創建一個二進制緩沖區,它將顯示為 [19] 的緩沖區,這是 8 個最低有效值8211 位。這是摘要中用于計算 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}如果您需要更多信息,請告訴我。謝謝!更新:這已解決,請查看答案。
- 2 回答
- 0 關注
- 213 瀏覽
添加回答
舉報
0/150
提交
取消