Node.js Twilio客户端库validateRequest在AWS Lambda中验证请求失败
解决Twilio Studio HTTP请求到AWS Lambda的签名验证失败问题
你遇到的问题根源在于:Twilio的validateRequest方法默认是为application/x-www-form-urlencoded类型的请求设计的,但你用了application/json的Content-Type,直接传JSON字符串会导致签名计算不匹配。
修复步骤及代码
- 先把Lambda收到的JSON字符串请求体解析为键值对对象
- 确保传入
validateRequest的是解析后的对象,而非原始字符串 - 确认请求URL和Twilio调用时的完全一致(包括查询参数,若有)
修改后的代码如下:
const authToken = process.env.twilio_auth_token; const client = require('twilio'); exports.handler = (event) => { const twilioSignature = event.headers['x-twilio-signature']; // 解析JSON请求体为对象,这是验证的关键 const requestBody = JSON.parse(event.body); // 注意:URL必须和Twilio发送请求时使用的完全一致,包括查询参数 const requestUrl = 'https://my-function-url.io/'; const requestIsValid = client.validateRequest( authToken, twilioSignature, requestUrl, requestBody ); if (requestIsValid) { console.log('请求验证通过'); } else { console.log('请求验证失败'); } };
额外注意事项
- 确认
authToken是Twilio账户的认证令牌,不要误用账户SID - 如果你的Lambda函数URL带有查询参数(比如
https://my-function-url.io/?id=123),必须把完整的URL传入requestUrl,Twilio会将查询参数纳入签名计算 - 检查Lambda的
event.headers中是否正确获取到x-twilio-signature头(Lambda中HTTP头键通常为小写) - Twilio计算签名时会对所有参数按字母顺序排序,确保解析后的JSON对象没有多余或缺失的字段
内容的提问来源于stack exchange,提问作者jipchik
相关产品推荐
相关产品推荐

