Проверка Mandrill в ruby, потерянная при переводе между php и ruby

Я пытаюсь следовать шагам, описанным Мандриллом здесь http://help.mandrill.com/entries/23704122-Authenticating-webhook-requests для проверки входящих запросов. Я настроил тестовый requestb.in с URL-адресом, видимым в коде. Я хочу, чтобы этот метод возвращал подпись мандрила, которая в данном случае H7Zky1B/GShKH4kuQcfUhNrQq+k=, но вместо этого каждый раз возвращает другое значение. Где я ошибаюсь?

пример кода php, предоставленный mandrill

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

person agarrow    schedule 23.05.2013    source источник
comment
Вы пробовали «/ 15wvu0y1» для URL-адреса вместо полного URL-адреса?   -  person andy boot    schedule 06.06.2013


Ответы (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 
person Kaitlin    schedule 12.06.2013
comment
Также важно отметить, что указанные выше параметры являются параметрами POST (включая параметр mandrill_events из Mandrill), а НЕ параметрами, прикрепленными к маршруту Webhook. - person Will Nathan; 05.07.2013
comment
@JeremyHaile - я бы порекомендовал создать новую тему с информацией о том, что конкретно не работает, или связаться со службой поддержки Mandrill через кнопку «Поддержка» в вашей учетной записи. Если это не работает, потребуются дополнительные сведения о конкретной проблеме, с которой вы столкнулись. - person Kaitlin; 21.10.2013

Это сработало для меня:

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

Однако методы раздевания могут быть излишними.

person Alex C    schedule 25.11.2013
comment
Это сработало и для меня! Мне нужен был последний strip вызов, чтобы он работал. - person ppires; 10.12.2014