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 变量
使用 ruby、Sinatra 和 Mandrill 如何从 api 调用访问单个元素并打印为 HTML?