我有一个类似的 来自用户的请求,我正在尝试生成一个与 Twitch EventSub 的验证请求签名相匹配的 HMAC。
我正在按照 Twtich 的 示例进行验证,但我无法获得可创建匹配 HMAC 的主体。
使用 v4 函数删除
request.rawBody
我已经尝试过:
request.text()
request.json()
然后字符串化request.arrayBuffer()
和流程request.blob()
以及直接将 await request.text()
添加到 hmac 更新操作(如其他链接的 SO 问题中的建议),但没有成功。如何在 Azure Fuctions v4 Javascript 中从请求的原始正文中获取原始正文?
我正在使用的代码如下:
app.http('twitchCommandHandler', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
const signature = request.headers.get('Twitch-Eventsub-Message-Signature');
const timestamp = request.headers.get('Twitch-Eventsub-Message-Timestamp').toLowerCase();
const messageId = request.headers.get('Twitch-Eventsub-Message-Id').toLowerCase();
const messageType = request.headers.get('Twitch-Eventsub-Message-Type').toLowerCase();
const body = await request.text();
const message = messageId + timestamp + body;
const hmac = 'sha256=' + (crypto.createHmac('sha256', process.env.TWITCH_WEBHOOK_SECRET).update(message).digest('hex'));
const verifyHmac = crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(signature));
if (verifyHmac) {
return { status: 200, body: body.challenge, headers: { 'Content-Type': 'text/plain' } };
} else {
return { status: 401 };
}
}
});
我已尝试了从 Azure Functions 获取请求正文的所有可用方法,包括
request.body
,但没有结果创建与 Twitch 提供的签名匹配的 HMAC。 我希望能够获得用于生成签名的原始主体,以使用适当的匹配秘密来验证该签名。
文档显示V4改变了请求体类型。
V4 根据您请求的类型返回完整数据。
const body = await request.text(); // returtns body in text format
const body = await request.json(); //retuns bosy in json format
const body = await request.formData(); //retuns bosy in formData
const body = await request.arrayBuffer(); //retuns bosy in array Buffer
const bosy = await request.blob(); //retuns bosy in blob format
如果您想使用 bosy 数据进行将来的处理。我建议使用
await request.json();
,因为您可以使用 json
对象数据进行多个数据处理。
我的代码:-
const { app } = require('@azure/functions');
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
const body = await request.json();
return {
status: 200,
body: body
}
}
});
OUTPUT
:正如你所看到的,我正在使用
await request.json()
,它正在以 json 格式重新调整文本。