此字段的值是webhook HTTP请求正文的十六进制HMAC签名,使用客户端密钥作为密钥,SHA256作为散列函数。
但是什么是HTTP请求体?我假设它是从webhook(https://developer.uber.com/docs/webhooks#section-example-post)收到的JSON主体。
如果是,那么如何在NodeJS中验证它作为HMAC的加密模块并不接受JSON [我试图对JSON进行字符串化,但它会生成不同的哈希]。或者如何将JSON转换为缓冲区,因为这是下一个最佳选择
如果没有,那么我应该使用什么?
[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")
})
答案 0 :(得分:4)
更新了答案
优步认为在webhook中插入反斜杠是一个错误,并发布了修复程序。下面的解决方法现在将破坏比较。截至2016年4月28日,使用Node编写的客户端应该只执行比较而无需修改webhook主体。不同于节点忽略转义序列中黑色滑动的行为的语言客户端不受影响。
原始答案
JS ignores the backslash when reading escape sequences in a string。缺少反斜杠会破坏您的比较,因为它包含在webhook事件签名中。
立即解决方法是使用正则表达式重新插入这些反斜杠。
var reconstitutedWebhookBody = input.replace(/\//g, '\\' + '/');
如果webhooks开始包含其他可以逃避的字符,那么正则表达式将需要扩展。
答案 1 :(得分:0)
我遇到了同样的问题。 Uber在键和值之前发送带有空格的json。喜欢这个
{"event_id": "...", "resource_href": "...", "meta": {"status": "...", "rider_id": "...", "user_id": "...", "resource_id": "..."}, "event_type": "...", "event_time": ...}
您可以在激活boryparser之前执行此操作。并从此数据创建十六进制
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();
});