验证 Shopify webhook

tsc*_*wab 3 ruby-on-rails http http-post webhooks shopify

我相信要将 Shopify webhook 与 Rails 应用程序集成,Rails 应用程序需要禁用默认verify_authenticity_token方法,并使用标头实现自己的身份验证X_SHOPIFY_HMAC_SHA256Shopify 文档说只使用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
Run Code Online (Sandbox Code Playgroud)

Shopify Webhook 定向到正确的 URL,并且路由将其提供给上面显示的控制器方法。但是当我发送测试通知时,输出不正确。两个HMAC不相等,因此未验证。我相当确定问题在于 Shopify 使用整个请求作为身份验证哈希的种子,而不仅仅是 POST 内容。所以,我需要原始的、未受影响的 HTTP 请求,除非我弄错了。

经过至少一个小时的搜索后,这个问题似乎是互联网上唯一有希望的问题。这正是我要问的,并且得到了 30 票赞成的接受答案。但他的回答……很荒谬。它吐出各种难以理解的、乱码的东西。我错过了一些明显的东西吗?

此外,这篇文章似乎表明我正在寻找的东西是不可能的。似乎 Rails 从未收到过纯粹的请求,但在到达 Rails 之前,Rack 将其分成不同的部分。如果是这样,我想我也许可以尝试重新组装它,但我什至必须使标头的顺序正确才能使哈希工作,所以我无法想象这是可能的。

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

tsc*_*wab 5

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

您的所有 Webhook 都将使用 ---MY_REAL_SHARED_SECRET--- 进行签名,以便您可以验证其完整性。

这是我需要用来验证网络钩子的秘密。为什么有两个,我不知道。