質問

私はOauthを介してTwitterで遊ぶための小さなRubyプログラムを書いていますが、まだ正しい方法を見つけていません 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に戻ることなく、実際にこれを行う方法に関するいくつかのヒントが欲しいです。私は言語を学ぼうとしている間、私は図書館のファンではないので、宝石はほとんど問題外です。

ありがとう!

役に立ちましたか?

解決

以下はあなたのPHPコードに相当しますが、私はそれを単一の行で包むことを選択しませんでした。

Gem Ruby-Hmacを使用しています。これは、Ruby 1.9と同様に1.8で動作するためです。 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top