gpt4 book ai didi

node.js - 无法在 Google 云功能中验证 Twilio 请求

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:37 24 4
gpt4 key购买 nike

我有一个 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);

我确认 token 的值与 Twilio 帐户设置中的身份验证 token 匹配,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');

将签名值与 header 值进行比较后,两者从未匹配。

最佳答案

这里是 Twilio 开发者布道者。

我建议使用 validateRequest 方法,因为它可以为您完成大部分工作。

您不需要执行您尝试过的参数排序,JavaScript 对象是无序的并且 the library sorts and appends the parameters to the URL string already .

您需要检查的是,该 URL 是否是您在 Twilio 控制台中设置的确切 Webhook URL,包括整个路径和所包含的任何查询参数。

此外,您是否已确保 request.body 已填充,并且您的 Express 应用正在使用 body-parser 将传入请求解析为 url 编码的表单参数?

app.use(bodyParser.urlencoded({ extended: false }));

如果您尝试将请求验证为中间件,请确保在正文解析之后完成请求验证。

这些有什么帮助吗?

关于node.js - 无法在 Google 云功能中验证 Twilio 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com