gpt4 book ai didi

facebook - 从 Facebook 验证 X-Hub-Signature

转载 作者:行者123 更新时间:2023-11-30 05:24:16 37 4
gpt4 key购买 nike

我是 Play Framework(在本例中为 2.5 和 Scala)的初学者 - 我正在尝试通过为 Facebook Messenger 构建一个机器人来学习。但是,我在尝试验证消息签名时遇到了困难。

我已经按照 Facebook 文档创建了一个 webhook。它使用 getRawMessages 处理 POST 请求(参见下面的代码)。然后尝试使用 verifyPayload 函数验证请求是否由 Facebook 签名。但是,我似乎无法让计算出的哈希值和实际哈希值相匹配。

我已经率先研究了这个问题:How to verify Instagram real-time API x-hub-signature in Java?这似乎做了很多我想做的,但对于 Instagram 等价物。但我似乎还是做对了。

val secret = "<facebooks secret token>"  

def getRawMessages = Action (parse.raw) {
request =>

val xHubSignatureOption = request.headers.get("X-Hub-Signature")

try {
for {
signature <- xHubSignatureOption
rawBodyAsBytes <- request.body.asBytes()
} yield {
val rawBody = rawBodyAsBytes.toArray[Byte]
val incomingHash = signature.split("=").last
val verified = verifyPayload(rawBody, secret, incomingHash)
Logger.info(s"Was verified? $verified")
}
Ok("Test")
}
catch {
case _ => Ok("Test")
}
}

val HMAC_SHA1_ALGORITHM = "HmacSHA1"

def verifyPayload(payloadBytes: Array[Byte], secret: String, expected: String): Boolean = {

val secretKeySpec = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), HMAC_SHA1_ALGORITHM)
val mac = Mac.getInstance(HMAC_SHA1_ALGORITHM)
mac.init(secretKeySpec)
val result = mac.doFinal(payloadBytes)

val computedHash = Hex.encodeHex(result).mkString
Logger.info(s"Computed hash: $computedHash")

computedHash == expected
}

Facebook webhook docs状态:

The HTTP request will contain an X-Hub-Signature header which contains the SHA1 signature of the request payload, using the app secret as the key, and prefixed with sha1=. Your callback endpoint can verify this signature to validate the integrity and origin of the payload

Please note that the calculation is made on the escaped unicode version of the payload, with lower case hex digits. If you just calculate against the decoded bytes, you will end up with a different signature. For example, the string äöå should be escaped to \u00e4\u00f6\u00e5.

我猜我缺少的是将有效负载正确转义为 unicode,但我似乎无法找到一种方法来做到这一点。引用问题中的答案似乎也只是获取字节数组,而没有对其进行任何其他操作 (jsonRawBytes = jsonRaw.asBytes();)。

任何有关如何进行的帮助将不胜感激。

最佳答案

原来我一直在使用错误的 secret 。如果其他人犯了同样的错误,请注意它是您想要的应用程序仪表板上可用的“App Secret”。请参见下面的屏幕截图。

enter image description here

关于facebook - 从 Facebook 验证 X-Hub-Signature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37332858/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com