私はPlay Framework(この場合は2.5とScala)の初心者です。Facebookのメッセンジャー用のボットを構築することで学びたいと思っています。しかし、私はメッセージの署名を検証しようとしています。FacebookからのX-Hub-Signatureの確認
私はFacebookの文書に従ってWebhookを作成しました。 getRawMessages
(下のコードを参照)を使用してPOSTリクエストを処理します。これは、要求がFacebookによってverifyPayload
機能を使用して署名されていることを確認しようとします。しかし、計算されたハッシュと実際のハッシュが一致するようには見えません。
私はこの質問を見ることから先導しました: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
}
投稿webhook docs状態:
HTTPリクエストは、 キーとしてアプリ秘密を使用して、要求ペイロードの SHA1の署名を含むX-ハブ署名ヘッダを含むであろう接頭辞はsha1 =です。あなたのコールバックエンドポイントは、ペイロードの完全性と起源
を検証するために、この 署名を検証することができます計算は小文字進数字で、ペイロードのエスケープユニコード バージョンで作られていることに注意してください。デコードされたバイトに対して と計算された場合は、別の シグネチャで終了します。たとえば、文字列ööåは \ u00e4 \ u00f6 \ u00e5にエスケープする必要があります。
ペイロードがユニコードに正しくエスケープされていると思いますが、私はそれを行う方法を見つけることができないようです。また、参照された質問の答えは、それ以上何もしないでバイト配列を取得するようにも見えました(jsonRawBytes = jsonRaw.asBytes();
)。
お手数をお掛けするとどんな助けになるでしょうか。
私は同じ間違いをしました。私は、* App Secretの代わりに* Webhook verify token *を使っていました。ありがとう! – kiewic
私はページアクセストークンを使用していました!どうもありがとう! – pronoob