簡體   English   中英

無法在Google雲功能中驗證Twilio請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM