2016-05-19 16 views
4

私は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();)。

お手数をお掛けするとどんな助けになるでしょうか。

答えて

5

私は間違った秘密を使っていました。他の誰かが同じ間違いを犯したら、あなたが望むアプリケーションダッシュボードで利用可能な "App Secret"に注意してください。下のスクリーンショットを参照してください。

enter image description here

+1

私は同じ間違いをしました。私は、* App Secretの代わりに* Webhook verify token *を使っていました。ありがとう! – kiewic

+0

私はページアクセストークンを使用していました!どうもありがとう! – pronoob

関連する問題