[英]Unable to validate Twilio request in Google cloud function
我有一個Google雲功能,Twilio向其發送帶有SMS狀態的POST請求,但是我無法使用https://www.twilio.com/docs/usage/security中概述的任何方法來驗證該請求是否來自Twilio。
我的第一次嘗試是使用validateRequest函數,如下面的代碼所示
const twilio = require('twilio');
let url = 'https://....cloudfunctions.net/...'
let token = 'XXXX';
let header = request.headers['x-twilio-signature'];
let sortedKeys = Object.keys(request.body).sort();
let sortedParams = {};
sortedKeys.forEach(key => {
sortedParams[key] = request.body[key];
});
let validated = twilio.validateRequest(token, header, url, sortedParams);
我確認令牌的值與Twilio帳戶設置中的auth令牌匹配,sortedParams包含按字母順序排序的駝峰式Twilio請求參數,並且URL與創建SMS時傳遞給Twilio客戶端的URL匹配。 但是,validateRequest將始終返回false。
我的下一個嘗試涉及通過從https://www.twilio.com/docs/libraries/reference/twilio-node/3.18.0/webhooks_webhooks.js.html復制代碼來哈希化URL和請求參數的組合
const crypto = require('crypto')
sortedKeys.forEach(key => {
url = `${url}${key}${request.body[key]}`;
});
let signature = crypto
.createHmac('sha1', token)
.update(Buffer.from(url, 'utf-8'))
.digest('base64');
將簽名的值與標頭的值進行比較后,兩者從未匹配。
Twilio開發人員布道者在這里。
我建議使用validateRequest
方法,因為它可以為您完成大部分工作。
您無需執行嘗試的參數排序,JavaScript對象是無序的, 並且庫已經將參數排序並將其附加到URL字符串中了 。
您需要檢查的是該URL是您在Twilio控制台中設置的確切Webhook URL,包括完整路徑和所包含的任何查詢參數。
另外,您是否確保填充了request.body
,並且您的express應用正在使用body-parser解析傳入的請求作為url編碼的表單參數?
app.use(bodyParser.urlencoded({ extended: false }));
如果您嘗試將請求驗證為中間件,請確保在正文解析后完成請求驗證。
有什么幫助嗎?
事實證明,validateRequest並沒有什么問題,而是我聲明令牌的方式。 而不是將其硬編碼為函數代碼,而是從Google存儲桶中將其檢索為緩沖區,然后將其轉換為字符串。 出於未知原因,即使在視覺上,檢索到的值與原始標記匹配,===比較也返回false。 一旦我對令牌進行了硬編碼,一切都會正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.