node.js - 验证来自 WooCommerce webhooks 签名的正确方法

标签 node.js woocommerce woocommerce-rest-api

当我尝试验证来自 WooCommerce webhook 的签名时,遇到了一个奇怪的问题。这是我用来创建签名的部分:

verified = crypto.createHmac('SHA256', secret).update(new Buffer(JSON.stringify(body), 'utf8')).digest('base64');

它适用于每个具有 removed 主题的 Webhook,并且请求正文类似于以下内容:

{"id":360}

不幸的是,对于每个具有 updatedcreated 主题的 Webhook,我的签名都不相同。请求正文也更加复杂。

 {"product":{"title":"Test","id":392,"created_at":"2017-02-11T21:40:37Z","updated_at":"2017-02-11T21:40:37Z","type":"simple","status":"publish","downloadable":false,"virtual":false,"permalink":"http://cedrus.ma/chezalfred/livraison/non classu00e9/test/","sku":"","price":"","regular_price":"","sale_price":null,"price_html":"","taxable":true,"tax_status":"taxable","tax_class":"","managing_stock":false,"stock_quantity":null,"in_stock":true,"backorders_allowed":false,"backordered":false,"sold_individually":false,"purchaseable":false,"featured":false,"visible":true,"catalog_visibility":"visible","on_sale":false,"product_url":"","button_text":"","weight":null,"dimensions":{"length":"","width":"","height":"","unit":"cm"},"shipping_required":true,"shipping_taxable":true,"shipping_class":"","shipping_class_id":null,"description":"","short_description":"","reviews_allowed":true,"average_rating":"0.00","rating_count":0,"related_ids":[],"upsell_ids":[],"cross_sell_ids":[],"parent_id":0,"categories":[],"tags":[],"images":[{"id":0,"created_at":"2017-02-11T21:40:40Z","updated_at":"2017-02-11T21:40:40Z","src":"http://cedrus.ma/chezalfred/wp-content/plugins/woocommerce/assets/images/placeholder.png","title":"Etiquette","alt":"Etiquette","position":0}],"featured_src":"","attributes":[],"downloads":[],"download_limit":0,"download_expiry":0,"download_type":"","purchase_note":"","total_sales":0,"variations":[],"parent":[],"grouped_products":[],"menu_order":0}}

我认为当请求正文更复杂时,JSON.stringify() 会出现问题。

验证来自 WooCommerce webhooks 的签名的正确方法是什么?

最佳答案

我使用相同的代码遇到了与您类似的问题(它显然适用于某些人,如此处所述:SHA256 webhook signature from WooCommerce never verifies)

最终对我有用的是使用 bodyParser 中间件以不同的方式获取原始主体值:
app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))
(如: https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100 中所述)

所以现在不要使用 new Buffer(JSON.stringify(body), 'utf8') 我只使用req.rawBody
我希望这也能解决您的问题。

关于node.js - 验证来自 WooCommerce webhooks 签名的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182387/

相关文章:

wordpress - Woocommerce 产品导入 API 上传特色图片

node.js - 如何在 ReactJs 项目中使用 Esri Arcgis Map?

javascript - req.ip 可以在 Express.js 中伪造吗?

php - 从 Woocommerce 中的优惠券使用中排除具有 2 个特定属性术语的变体

javascript - 使用 woocommerce REST API 和 javascript(客户端)创建新产品?

wordpress - WooCommerce Order API 总是创建空订单

Mysql for NodeJS 不在查询中扩展数组

javascript - 安装模块与使用其 url 包含模块之间的主要区别是什么?

wordpress - 显示描述而不是摘录,限制字数并添加阅读更多

php - 在 WooCommerce 中获取产品类别和标签术语作为元关键字