我认为让Shopify webhook与Rails应用程序Rails应用程序needs to disable the default verify_authenticity_token
method集成,并使用X_SHOPIFY_HMAC_SHA256
标头实现自己的身份验证。 Shopify docs说只使用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不相等,因此未经验证。我很确定问题是Shopify使用整个请求作为身份验证哈希,而不仅仅是POST内容。所以,我需要原始的,未触及的HTTP请求,除非我弄错了。
在至少一个小时的搜索之后,This问题似乎是互联网上唯一有希望的事情。这正是我所要求的,它有30个赞成票的接受答案。但他的回答......很荒谬。它吐出了各种不可理解的乱码。我错过了一些明显的东西吗?
此外,this article似乎表明我所寻找的是不可能的。看起来Rails从来没有得到过纯粹的请求,但在它进入Rails之前,它被Rack分成了不同的部分。如果是这样,我想我可能会尝试重新组装它,但我甚至必须得到标题的顺序才能正常工作,所以我无法想象这是可能的。
我想我的主要问题是,我完全搞砸了吗?
答案 0 :(得分:3)
问题发生在我的SHARED_SECRET中。我认为这是API密钥,因为几天前它在Shopify管理页面中被称为共享密钥。但现在我在通知页面的底部看到一个小段落,上面写着
所有的webhook都将以--- MY_REAL_SHARED_SECRET ---签署 你可以验证他们的诚信。
这是我需要用来验证webhook的秘密。为什么有两个,我不知道。
答案 1 :(得分:0)
您是否按照他们在导游中显示的顺序尝试过这样做?他们有红宝石的工作样本。
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标头 使用应用程序的共享密钥生成,以及发送的数据 请求。
密钥是“使用请求中发送的共享密钥和数据生成的”,因此所有这些都应该在您的端部可用,包括DATA和共享密钥。