validationShopify webhook

我认为要让Shopify webhook与Rails应用程序集成,Rails应用程序需要禁用默认的verify_authenticity_token方法 ,并使用X_SHOPIFY_HMAC_SHA256标头实现自己的身份validation。 Shopify文档说只使用request.body.read 。 所以,我做到了:

 def create verify_webhook(request) # Send back a 200 OK response head :ok end def verify_webhook(request) header_hmac = request.headers["HTTP_X_SHOPIFY_HMAC_SHA256"] digest = OpenSSL::Digest.new("sha256") request.body.rewind calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, SHARED_SECRET, request.body.read)).strip puts "header hmac: #{header_hmac}" puts "calculated hmac: #{calculated_hmac}" puts "Verified:#{ActiveSupport::SecurityUtils.secure_compare(calculated_hmac, header_hmac)}" end 

Shopify webhook指向正确的URL,路由将其提供给上面显示的控制器方法。 但是当我发送测试通知时,输出不正确。 两个HMAC不相等,因此未经validation。 我很确定问题是Shopify使用整个请求作为身份validation哈希,而不仅仅是POST内容。 所以,我需要原始的,未触及的HTTP请求,除非我弄错了。

在至少一个小时的搜索之后, 这个问题似乎是互联网上唯一有希望的事情。 这正是我所要求的,它有30个upvotes接受的答案。 但他的回答……很荒谬。 它吐出了各种不可理解的乱码。 我错过了一些明显的东西吗?

此外, 这篇文章似乎暗示我正在寻找的是不可能的。 看起来Rails从来没有得到过纯粹的请求,但在它进入Rails之前,它被Rack拆分成不同的部分。 如果是这样,我想我可能会尝试重新组装它,但我甚至必须得到标题的顺序正确的哈希工作,所以我无法想象这是可能的。

我想我的主要问题是,我完全搞砸了吗?

问题发生在我的SHARED_SECRET中。 我认为这是API密钥,因为几天前它在Shopify管理页面中被称为共享密钥。 但现在我在通知页面底部看到一个小段落,上面写着,

您的所有webhook都将使用— MY_REAL_SHARED_SECRET签名—这样您就可以validation其完整性。

这是我需要用来validationwebhooks的秘密。 为什么有两个,我不知道。

您是否按照他们在指南中显示的顺序尝试了这样做? 他们有ruby的工作样本。

 def create request.body.rewind data = request.body.read header = request.headers["HTTP_X_SHOPIFY_HMAC_SHA256"] verified = verify_webhook(data, header) head :ok end 

他们在导游中说:

每个Webhook请求都包含一个X-Shopify-Hmac-SHA256标头,该标头使用应用程序的共享密钥以及请求中发送的数据生成。

密钥是“使用请求中发送的共享密钥和数据生成的”,因此所有这些都应该在您的数据和共享密钥上可用。