【问题标题】:Matching Square Webhook signature in Ruby (on Rails)在 Ruby 中匹配 Square Webhook 签名(在 Rails 上)
【发布时间】:2018-07-06 14:41:25
【问题描述】:

我正在尝试匹配此处记录的 X-Square-Signature 标头:https://docs.connect.squareup.com/api/connect/v1/#validating-notifications

我目前正在使用 OpenSSL::HMAC 来生成摘要,但事情似乎不正确。

string_to_sign = "#{request.url}#{param_hash.to_json}"
header_signature = request.headers["X-Square-Signature"]

# split into multiple lines for clarity
digest = OpenSSL::Digest.new('sha1')
hmac = OpenSSL::HMAC.digest(digest, ENV["SIGNATURE_KEY"], string_to_sign)

# stripping the newline off the end
hmac_64 = Base64.encode64(hmac).strip

出于某种原因,尽管遵循了上面 API 文档中提供的说明,但我得到的摘要却截然不同。我对摘要的计算似乎也与他们的 python 示例一致 (https://github.com/square/connect-api-examples/blob/master/connect-examples/v1/webhooks.py#L75-L87)。

我已经验证 string_to_sign 值与我应该遵循的模式相同,当我手动制作帖子时它可以工作,但我是通过同样的方法生成我的签名,所以它当然会排列。

我可能忽略的摘要/签名计算过程有什么细节吗?

【问题讨论】:

    标签: ruby-on-rails ruby webhooks hmac square-connect


    【解决方案1】:

    我不确定这是否是您问题的根源,但您应该使用request.raw_post 而不是param_hash.to_json。请求正文是一个 json 对象,并且 json 对象上的属性没有规范的排序。当您将参数哈希转换回 json 时,不能保证属性与原始请求正文中的顺序相同。

    再试一次

    string_to_sign = "#{request.url}#{request.raw_post}"
    

    【讨论】:

      【解决方案2】:

      听起来您正在尝试复制 Square 文档中的示例。您提到您已验证 string_to_signhttp://www.example.com{"merchant_id":"JGHJ0343","event_type":"PAYMENT_UPDATED","entity_id":"Jq74mCczmFXk1tC10GB"},但您是否已验证环境变量 SIGNATURE_KEYEXAMPLE_SECRET_123,如文档中所示?

      使用替换值编写的代码并设置环境变量会计算示例中给出的哈希值:DBP9woNqJpO4d4/ZFE7xveLIGPU=

      【讨论】:

      • 我的 SIGNATURE_KEY 是 Square 网站上的 Webhook 控制面板提供给我的,我已经验证它们是匹配的。 EXAMPLE_SECRET_123 只是显示功能的占位符。
      猜你喜欢
      • 2016-12-20
      • 2021-10-10
      • 2022-11-19
      • 2022-12-12
      • 2019-08-26
      • 1970-01-01
      • 2014-06-07
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多