2017-07-03 5 views
0

私のメッセンジャーアプリにX-Hubの検証を追加しています。 https://developers.facebook.com/docs/messenger-platform/webhook-referenceFacebook Messenger共有ロケーションのX-Hub-Signatureを確認する

私はテキストメッセージの代わりに場所を送信すると、ハッシュが生成され、Facebookのハッシュが私に与えるため、確認が失敗しますヘッダーが一致しません。ここで私の検証コードがある:ここで

module.exports.requestIsValid = function(event) { 
    if (event['headers']['X-Hub-Signature']) { 
     var sha  = event['headers']['X-Hub-Signature'] 
     var body = JSON.stringify(event.body); 
     return sha == `sha1=${crypto.createHmac('sha1', config.APP_SECRET).update(body).digest('hex')}`; 
    } 

    return false; // this return is never called, I know that the first return is the one returning false when it should be true 
} 

は、通常のテキスト・メッセージ・ペイロードの例である:

{ "本体":{ "オブジェクト": "ページ"、 "エントリ":[{ "ID ":" 1366222643461024 "、" time ":1499114399253、" messaging ":[{" sender ":{" id ":" 1582085681843981 "}"受信者 ":{" id ":" 1366222643461024 "}、" timestamp " "method": "POST"、 "principalId":1499114399084、 "message": "ミッド": "$ cAASAZhi0_wRjO3OtbFdCi5lV2qe4"、 "seq":52192、 "text": "テスト"}} "X-Real-IP": "173.252.88.182"、 "X-Forwarded-For": "173.252.88.182"、 "Host": "test.localtunnel.me"、 "localContext_authorizer_principalId" 「X-Forwarded-Proto」:「https」、「X-Nginx-Proxy」:「true」、「Connection」:「close」、「Content-Length」:「270」、「Accept」:「"X-Hub-Signature": "sha1 = 0f51d788fe5f1111846097ad016728cdcd06029f"}、 "query":{} "、" Accept-Encoding " "offlineContext_acciId"、 "apiKey": "offlineContext_apiKey"、 "caller": "offlineContext_caller"、 "cognitoAuthenticationProvider": "offlineContext_cognitoAuthenticationProvider"、 "cognitoAuthenticationType": " 「offlineContext_cognitoAuthenticationType」、「sourceIp」:「127.0.0.1」、「user」:「offlineContext_user」、「userAgent」:「」、「userArn」:「offlineContext_userArn」}、「stageVariables」:{}、「isOffline」:

{ "本体":{ "オブジェクト": "ページ"、 "エントリ":[{ "ID": "1366222643461024"、 "時間

そしてここでは、位置とペイロードの一例です":1499114451619、"メッセージ":" {""送付者 ":{" id ":" 1582085681843981 "}、"受信者 ":{" id ":" 1366222643461024 "}、" timestamp ":1499114451469、" message ":{" mid ":" mid " 「ブランド」の場所、「url」:「https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.bing.com%2Fmaps%2Fdefault.aspx%3Fv%3D2%26pc%3DFACEBK%26mid%3D8100%26where1%3D35.142236316764%252C%2B-106.53531087607%26FORM%3DFBKPL1%26mkt%3Den-US&h=ATOu8uYrLDiFl6wG8RVfhXvwkMl7uB_l2MHqB_uKLhk8qC9p1ua0EOLpGkznVX7Y8YfxSXP7vDuAR7swPmDCw1esH2bwKhNNsZKxVPC2ViC2AFMO_g&s=1&enc=AZMYxff8btvCZWHtzUR4oFL7K2Mg6nXM_O_tRXXL-L8z508UAOauiSRztoRvWdlGCWU1dNRdNK1ls2CGulM8lvzR」、「タイプ」:「場所」、「ペイロード」:{"座標": "$"、 "seq":52196、 "添付ファイル" {"lat":35.142236316764、 "long": - 106.53531087607}}}}}]]}、 "method": "POST"、 "principalId": "offlineContext_authorizer_principalId"、 "headers":{"X-Real- Ip ":" 173.252.90.239 "、" X-Forwarded-For ":" 173.252.90.239 "、" Host ":" test.localtunnel.me "、" X-Forwarded-Proto ":" https "、" X-コンテンツの長さ: "911"、 "Accept": "/"、 "Accept-Encoding": "deflate、gzip"、 "Nginx-Proxy" X-Hub-Signature ":" sha1 = 34f23436b2744b9b0cc8776922e7386c454786db "}、" query ":{}、" path ":{}、" identity ":{" accountId ":"コンテンツタイプ " 「offlineContext_accountId」、「apiKey」:「offlineContext_apiKey」、「caller」:「offlineContext_caller」、「cognitoAuthenticationProvider」:「」 「offlineContext_userArn」}、「stageVariables」:{flineContext_cognitoAuthenticationProvider}、「cognitoAuthenticationType」:「offlineContext_cognitoAuthenticationType」、「sourceIp」:「127.0.0.1」、「user」:「offlineContext_user」、「userAgent」:「」、「userArn」: }、 "isOffline":true}

必要に応じて追加情報を提供していただき、幸いです。

更新: 検査の結果、ペイロードに「アタッチメント」フィールドがある場合にのみ検証が失敗するように見えます。それで絵やGIFなどを送っても失敗したら

+0

データを文字列化しないでください(最小の差でもハッシュが無効になる場合もあります)。最初にアプリケーションが受け取った生のポスト本体からハッシュを作成します。 – CBroe

+0

@CBroe stringifyを省略すると、このエラーが発生します - TypeError:データは文字列またはバッファでなければなりません。私は文字列化を去るとき、それは私が – Brandon

答えて

0

SHA1アルゴリズムを 'raw request body'に適用する必要があります。あなたが体を解析してそれをjsonに戻すなら、それは動作しない可能性があります。

+0

を使用している暗号ノードモジュールから来ているようにあなたのようにFacebookのウェブフックリクエストをデバッグしたい場合は、あなたがchatbotproxy.com –

+0

を使用することができルックス[OK]をそれが理にかなって、残念ながら、私はこのエラーを取得します - TypeError:データは文字列またはバッファでなければなりません。それは私が使用している暗号ノードモジュールから来ているように見えます – Brandon

関連する問題