Ruby方式为OAuth生成HMAC-SHA1签名

我正在编写一个小的ruby程序,可以通过OAuth与Twitter一起玩,还没有找到正确的方法来进行HMAC-SHA1签名。 到目前为止,我搞砸了

Base64.encode64(OpenSSL::HMAC.hexdigest(digest, key, stuff)).chomp 

但这会输出Twitter拒绝的东西,而不是有效的签名。 我实际上以更糟糕的方式解决了它,请尽量不要打我:

 php -r "echo rawurlencode(base64_encode(hash_hmac('sha1', '#{@signature}', '#{llave}', true)));" 

这最后一个实际上有效,我可以四处寻找我的东西。

我想要一些关于如何在不回复PHP的情况下实际执行此操作的提示。 当我试图学习一门语言时,我不是很喜欢图书馆,所以gem几乎是不可能的。

谢谢!

以下等同于您的PHP代码,但我选择不将它包装在一行中。

我正在使用gem ruby​​-hmac,因为它与1.8以及Ruby 1.9一起使用。 如果您只使用Ruby 1.9,我相信标准库包’digest’已经实现了HMAC(但是在1.8版本的软件包中缺少这个)。 确保gem install ruby-hmac

 require 'rubygems' require 'base64' require 'cgi' require 'hmac-sha1' key = '1234' signature = 'abcdef' hmac = HMAC::SHA1.new(key) hmac.update(signature) puts CGI.escape(Base64.encode64("#{hmac.digest}\n")) # equivalent to: # php -r "echo rawurlencode(base64_encode(hash_hmac('sha1', 'abcdef', '1234', true)));" 

更好的是,使用标准库包OpenSSL(大多数Linux和MacOS开箱即用)。 此代码适用于Ruby 1.8和1.9:

 require 'base64' require 'cgi' require 'openssl' key = '1234' signature = 'abcdef' puts CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1',key, signature)}\n")) # equivalent to: # php -r "echo rawurlencode(base64_encode(hash_hmac('sha1', 'abcdef', '1234', true)));" 
 def hmac_sha1(data, secret=HOST_KEY) require 'base64' require 'cgi' require 'openssl' hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha1'), secret.encode("ASCII"), data.encode("ASCII")) return hmac end