我將X-Hub驗證添加到我的Messenger應用程序。我在這裏瞭解到:https://developers.facebook.com/docs/messenger-platform/webhook-referenceFacebook Messenger驗證共享位置的X-Hub簽名
我已經成功地獲得驗證以使用簡單的文本消息,但是當我發送位置而不是文本消息時,驗證失敗,因爲我生成的散列和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" , 「時間」:1499114399253, 「消息接發」:[{ 「發件人」:{ 「ID」: 「1582085681843981」}, 「收件人」:{ 「ID」: 「1366222643461024」}, 「時間戳」: 1499114399084, 「消息」:{ 「中」: 「年年$ cAASAZhi0_wRjO3OtbFdCi5lV2qe4。」, 「序列」:52192, 「文」: 「測試」}}]}]}, 「方法」: 「POST」, 「principalId」: 「offlineContext_authorizer_principalId」, 「頭」:{ 「X-真實-IP」: 「173.252.88.182」, 「X - 轉發,對於」: 「173.252.88.182」, 「主機」: 「test.localtunnel.me」,」 X-Forwarded-Proto「:」https「,」X-Nginx-Proxy「:」true「,」Connection「:」close「,」Content-Length「:」270「,」Accept「:」/「,」Accept-Encoding「:」deflate,gzip「,」Content-Type「:」application/json「,」X-Hub-Signature「:」sha1 = 0f51d788fe5f1111846097ad016728cdcd06029f「},」query「:{ 「路徑」:{}, 「同一性」:{ 「帳戶ID」: 「offlineContext_accountId」, 「apiKey」: 「offlineContext_apiKey」, 「呼叫者」: 「offlineContext_caller」, 「cognitoAuthenticationProvider」: 「offlineContext_cognitoAuthenticationProvider」, 「cognitoAuthenticationType」:」 offlineContext_cognitoAuthenticationType」, 「SOURCEIP」: 「127.0.0.1」, 「用戶」: 「offlineContext_user」, 「的userAgent」: 「」, 「userArn」: 「offlineContext_userArn」}, 「stageVariables」:{}, 「IsOffline已」:真}
這裏是與位置的有效載荷的一個示例:
{ 「本體」:{ 「對象」: 「網頁」, 「入口」:[{ 「ID」: 「1366222643461024」,「時間「:1499114451619,」 消息「:[{」 發件人 「:{」 ID 「:」 1582085681843981 「},」 收件人 「:{」 ID 「:」 1366222643461024 「},」 時間戳 「:1499114451469,」 消息 「:{」 中間 「:」 中間。 「cAASAZhi0_wRjO3R6DVdCi8v9yqk0」,「seq」:52196,「attachments」:[{「title」:「Brandon's Location」,「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」,「type」:「location」 { 「LAT」:35.142236316764, 「長」: - 106.53531087607}}}]}}]}]}, 「方法」: 「POST」, 「principalId」: 「offlineContext_authorizer_principalId」, 「標題」:{「X-實葉 「:」 173.252.90.239" , 「X - 轉發,對於」: 「173.252.90.239」, 「主機」: 「test.localtunnel.me」, 「X - 轉發,原」: 「https」 開頭,「X- Nginx-Proxy「:」true「,」連接「:」關閉「,」內容長度「:」911「,」接受「:」/「,」接受編碼「:」deflate,gzip「內容類型 「:」 應用/ JSON 「 」X-集線器簽名「: 」SHA1 = 34f23436b2744b9b0cc8776922e7386c454786db「}, 」查詢「:{}, 」路徑「:{}, 」同一性「:{ 」帳戶ID「:」 offlineContext_accountId 「 」apiKey「: 」offlineContext_apiKey「, 」主叫方「: 」offlineContext_caller「, 」cognitoAuthenticationProvider「:」 第flineContext_cognitoAuthenticationProvider」, 「cognitoAuthenticationType」: 「offlineContext_cognitoAuthenticationType」, 「SOURCEIP」: 「127.0.0.1」, 「用戶」: 「offlineContext_user」, 「的userAgent」: 「」, 「userArn」: 「offlineContext_userArn」}, 「stageVariables」:{ },「isOffline」:true}
如果需要,歡迎提供額外信息。
更新: 在進一步檢查時,似乎驗證只在有效載荷中存在「attatchments」字段時失敗。所以如果在我發送圖片或gif或類似的東西時也失敗了。
你不應該自己對數據進行串聯(即使最小的差異也會使散列無效),而是首先從應用程序收到的原始文章主體創建散列。 – CBroe
@CBroe當我離開stringify時,我得到這個錯誤 - TypeError:數據必須是字符串或緩衝區。看起來它是來自我使用的加密節點模塊 – Brandon