如何validation超级webhook api?

优步文件说

此字段的值是webhook HTTP请求正文的hexHMAC签名,使用客户端密钥作为密钥,SHA256作为哈希函数。

但是HTTP请求体是什么? 我认为这是从webhook( https://developer.uber.com/docs/webhooks#section-example-post )收到的JSON正文。

如果是这样,那么如何在NodeJS中validation它作为HMAC的encryption模块不接受JSON [我尝试过JSONstring化,但它会生成一个不同的哈希]。 或者如何将JSON转换为缓冲区,因为这是下一个最佳select

如果不是,那我该用什么?

[UPDATE1]用于任务的代码:

app.post("/",function(req,res){ const crypto = require('crypto'); var input = res.body var str_input=JSON.stringify(input) const hmac = crypto.createHmac('sha256', '<CLIENT SECRET>'); hmac.update(str_input); console.log(hmac.digest('hex')); // print same as below console.log("e034ac7db29c3c0c10dfeced41a6cd850ed74c1c3c620863d47654cc7390359a") }) 

Solutions Collecting From Web of "如何validation超级webhook api?"

更新的答案

Uber认为将反斜杠插入到webhook主体中是一个bug,并发布了一个修复程序。 下面的解决方法现在将打破比较。 截至2016年4月28日,以Node编写的客户端应该只是在不修改webhook主体的情况下执行比较。 语言中不共享节点忽略转义序列中的黑色行为的客户端不受影响。

原始答复

当读取string中的转义序列时, JS 忽略反斜线 。 缺less的反斜杠正在打破您的比较,因为它包含在webhook事件签名中。

立即的解决方法是重新插入使用正则expression式的反斜杠。

var reconstitutedWebhookBody = input.replace(/\//g, '\\' + '/');

这个正则expression式将需要扩展,如果webhooks开始包括其他易变的字符。

我有同样的问题。 Uber在键和值之前使用空格发送json。 喜欢这个

 {“event_id”:“...”,“resource_href”:“...”,“meta”:{“status”:“...”,“rider_id”:“...”,“user_id”: “...”,“resource_id”:“...”},“event_type”:“...”,“event_time”:...}

你可以在激活boryparser之前做到这一点。 并从这个数据创buildhex

 app.use(function (req, res, next) { let data = ""; req.on('data', function(chunk){data += chunk}); req.on('end', function(){ req.jsonBody = JSON.parse(data); req.rawBody = data; req.originalUberReq = data; }); next(); });