ruby 中的 Mandrill 验证,在 php 和 ruby​​ 之间的翻译中丢失

Posted

技术标签:

【中文标题】ruby 中的 Mandrill 验证,在 php 和 ruby​​ 之间的翻译中丢失【英文标题】:Mandrill validation in ruby, lost in translation between php and ruby 【发布时间】:2013-05-19 01:20:22 【问题描述】:

我正在尝试按照 Mandrill 在此处列出的步骤http://help.mandrill.com/entries/23704122-Authenticating-webhook-requests 来验证传入的请求。我已经使用代码中看到的 url 设置了一个测试 requestb.in。我希望此方法返回山魈签名,在本例中为 H7Zky1B/GShKH4kuQcfUhNrQq+k= 但它每次都返回不同的值。我哪里错了?

mandrill 提供的 php 代码示例

function generateSignature($webhook_key, $url, $params) 
    $signed_data = $url;
    ksort($params);
    foreach ($params as $key => $value) 
        $signed_data .= $key;
        $signed_data .= $value;
    

    return base64_encode(hash_hmac('sha1', $signed_data, $webhook_key, true));

我的红宝石代码

 def valid?(params)
    wh_key = "Ny_lzk4zxENbNVezqECBxw"
    url = "http://requestb.in/15wvu0y1"
    signed_data = url
    params.sort.each do |key, value|
      signed_data += (key.to_s + value.to_s)
    end
    digest = OpenSSL::Digest.new('sha1')
    Base64.encode64("#OpenSSL::HMAC.digest(digest,signed_data,wh_key)") 
  end

【问题讨论】:

你试过用 '/15wvu0y1' 代替完整的 url 吗? 【参考方案1】:

这对我有用:

data = "http://my_awesome.com/api/webhook_action"

request.POST.sort_by  |key, value| key.to_i .each do |key,value|

    data += key.to_s.strip
    data += value.to_s.strip

end

digest = OpenSSL::Digest::Digest.new('sha1')
expected = Base64.encode64("#OpenSSL::HMAC.digest(digest,test_key, data)").strip

strip 方法可能有点矫枉过正。

【讨论】:

这对我也有用!我需要最后一个 strip 呼叫才能使其工作。【参考方案2】:

您肯定需要完整的 URL,包括开头的 http://。看起来您在倒数第二行中传递的参数的顺序可能不正确。不过,这应该可以工作,假设参数已经被格式解码:

def valid?(webhook_key, url, params, signature)
  data = url
  params.sort.each |k,v| data = url + k + v
  digest = OpenSSL::Digest::Digest.new('sha1')
  expected = Base64.encode64(OpenSSL::HMAC.digest(digest, webhook_key, data)).strip
  expected == signature
end 

【讨论】:

另外需要注意的是,上面提到的参数是 POST 参数(包括 Mandrill 的 mandrill_events 参数),而不是附加到 Webhook 路由的参数 @JeremyHaile - 我建议开始一个新主题,其中包含有关具体不起作用的信息,或者通过您帐户中的“支持”按钮与 Mandrill 支持团队联系。如果它不起作用,则需要有关您所看到的具体问题的更多详细信息。

以上是关于ruby 中的 Mandrill 验证,在 php 和 ruby​​ 之间的翻译中丢失的主要内容,如果未能解决你的问题,请参考以下文章

在 mandrill 模板中使用 Ruby/rails 变量

Mandrill 在 Rails 上发送电子邮件 ruby

使用 ruby​​、Sinatra 和 Mandrill 如何从 api 调用访问单个元素并打印为 HTML?

编码 64、Ruby 和 Mandrill API

将 Mailchimp/Mandrill 与 Ruby 结合使用

使用 Mandrill 时的 Ruby 引号语法