验证Webhook的请求

时间:2015-04-07 01:32:43

标签: ruby-on-rails wordpress webhooks

我有一个Rails应用程序,设置为从WooCommerce接收webhook。具体来说,我正在寻找创建订单的时间。我已经测试并验证了除了create之外我还有protect_from_forgery。现在我试图通过验证webhook来保护我的应用程序。 WooCommerce的文档声明在请求标头中传递了以下秘密:

  

secret:一个可选的密钥,用于生成请求正文的HMAC-SHA256哈希值,以便接收方可以验证Web挂钩的真实性

WooCommerce github doc

目前我不确定如何验证请求,然后采取行动。如果请求未经授权,请使用401拒绝。这是我正在尝试的内容:

class HooksController < ApplicationController

    protect_from_forgery
    before_action :restrict_access

    def order_created_callback
    ...
    end

    private

    SHARED_SECRET = 'my_secret_key'

    def verify_webhook(data, hmac_header)
        digest  = OpenSSL::Digest::Digest.new('sha256')
        calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, SHARED_SECRET, data)).strip
        calculated_hmac == hmac_header
    end

    def restrict_access
        data = request.body.read
        verified = verify_webhook(data, env["X-WC-Webhook-Signature"])
        head :unauthorized unless verified

    end
end

但到目前为止,我一直没有成功。任何投入将不胜感激。感谢。

1 个答案:

答案 0 :(得分:3)

好的,我发现了我遇到的问题。如果其他人试图使用WooCommerce web hook,似乎我的问题是正确地抓取请求的头文件以匹配我计算的HMAC。

SHARED_SECRET = "my_secret"

def verify_webhook(data, hmac_header)
    hash  = OpenSSL::Digest::Digest.new('sha256')
    calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(hash, SHARED_SECRET, data)).strip
    calculated_hmac == hmac_header
end

def restrict_access
    data = request.body.read
    head = request.headers["X-WC-Webhook-Signature"]
    verified = verify_webhook(data, head)
    if verified
        return
    else
        render nothing: true, status: :unauthorized
    end
end