验证Shopify webhook

时间:2017-06-23 20:55:25

标签: ruby-on-rails http http-post shopify webhooks

我认为让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分成了不同的部分。如果是这样,我想我可能会尝试重新组装它,但我甚至必须得到标题的顺序才能正常工作,所以我无法想象这是可能的。

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

2 个答案:

答案 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和共享密钥。

相关问题