如何获取 Azure Functions [Javascript] 原始 Body 数据以进行 HMAC 签名验证(Twitch EventSub 验证)

问题描述 投票:0回答:1

我有一个类似的 来自用户的请求,我正在尝试生成一个与 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。 我希望能够获得用于生成签名的原始主体,以使用适当的匹配秘密来验证该签名。

javascript node.js azure-functions hmac twitch
1个回答
0
投票

文档显示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 格式重新调整文本。

© www.soinside.com 2019 - 2024. All rights reserved.