Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中的Mandrill验证,在php和ruby之间的转换中丢失_Php_Ruby_Base64_Hmac_Mandrill - Fatal编程技术网

ruby中的Mandrill验证,在php和ruby之间的转换中丢失

ruby中的Mandrill验证,在php和ruby之间的转换中丢失,php,ruby,base64,hmac,mandrill,Php,Ruby,Base64,Hmac,Mandrill,我试图按照Mandrill在这里概述的步骤来验证传入的请求。我已经用代码中的url设置了一个testrequestb.in。我希望此方法返回mandrill签名,在本例中为H7Zky1B/GShKH4kuQcfUhNrQq+k=但每次返回不同的值。我哪里做错了 mandrill提供的php代码示例 function generateSignature($webhook_key, $url, $params) { $signed_data = $url; ksort($params

我试图按照Mandrill在这里概述的步骤来验证传入的请求。我已经用代码中的url设置了一个testrequestb.in。我希望此方法返回mandrill签名,在本例中为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));
}
我的ruby代码

 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

您肯定需要完整的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 
这对我很有用:

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方法可能有些过分。

您是否尝试过将“/15wvu0y1”用于url而不是完整url?同样重要的是,请注意,上面提到的参数是POST参数(包括来自mandrill的mandrill_events参数)而不是连接到Webhook的参数Route@JeremyHaile-我建议您开始一个新主题,了解哪些内容不起作用,或者通过您帐户中的“支持”按钮与Mandrill支持团队联系。如果它不起作用,你所看到的具体问题将需要更多的细节。这对我也起作用!我需要最后一次的
strip
调用才能让它工作。