当前位置: 首页 > 知识库问答 >
问题:

Webook的验证请求

戎桐
2023-03-14

我有一个设置为接收来自WooCommerce的网络钩子的Rails应用程序。具体来说,我正在寻找创建订单的时间。我已经测试并验证了它在我protect_from_forgery时是否有效,除了创建。现在我正在尝试通过验证网络钩子来保护我的应用程序。WooCommerce的留档html" target="_blank">声明在请求标头中传递以下秘密:

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

WooCommerce github文档

目前,我不确定应该如何验证请求,然后再根据请求采取行动。如果请求未经授权,请使用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个答案

麹渊
2023-03-14

好吧,我弄清楚了我遇到的问题。如果其他人试图使用WooCommerce网络挂钩,我的问题似乎是适当地抓取请求的头文件以将其与我计算的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
    Rack::Utils.secure_compare(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
 类似资料:
  • 我已经在Paypal中使用沙盒成功地实现了webhook集成。现在我想让它更安全,这样只有贝宝签名的通知才被接受。我试图使用 https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature\u post 但它总是返回失败。 请求是: {"auth_algo":"SHA256with RSA","transmis

  • 我正在使用IBM沃森助手创建一个机器人。我试图使用网络钩子,但不知道发送到网络钩子的POST请求JSON/超文本标记语言的格式。 我的案例研究是一个用户可以预购的商店。我想把订单细节发送到我的后端服务器,并给用户一个预购的参考号码。我在留档中没有发现IBM沃森助手发送的POST请求格式以及应该返回的响应格式。 我知道IBM Watson Assistant不需要特定的响应格式。它允许开发人员根据自

  • 对于错误的响应,是否可能在响应中返回验证注释消息?我认为这是可能的,但我注意到我们的项目没有给出详细的不良请求信息。 如果请求缺少IDField,我希望返回“IDField is required”。我用的是泽西2.0。我看到的回应是...

  • 这是我的视图代码: 和请求验证程序: 发送post请求以创建方法后,它将 SQLSTATE[42S22]:找不到列: 1054未知列'article.title'in'where cluse' SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“article.title”(SQL:选择count(*)作为来自的聚合,其中title=test) 更新 这是我的控制器代码

  • 我需要在爪哇中使用摇摆不定(YAML文件)来验证传入的REST请求。所以任何人都可以帮我这个。提前致谢。

  • 我们的例子中要求用户进行身份验证并且在我们应用程序的每个URL这样做。我们可以通过给http.authorizeRequests()添加多个子节点来指定多个定制需求到我们的URL。例如: protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() //1