1

FilePicker.ioセキュリティを実行できるようにするテストを作成しようとしています。コードは次のように実行されます。

ruby test.rb [file handle]

結果は、FilePickerURLに追加できるクエリ文字列です。ポリシーが正しく読み取られていることは確かですが、署名は正しく読み取られていません。誰かが私が間違っていることを教えてもらえますか?コードは次のとおりです。

require 'rubygems'
require 'base64'
require 'cgi'
require 'openssl'
require 'json'

handle = ARGV[0]
expiry = Time::now.to_i + 3600
policy = {:handle=>handle, :expiry=>expiry, :call=>["pick","read", "stat"]}.to_json
puts policy
puts "\n"
secret = 'SECRET'
encoded_policy = CGI.escape(Base64.encode64(policy))
signature = OpenSSL::HMAC.hexdigest('sha256', secret, encoded_policy)
puts "?signature=#{signature}&policy=#{encoded_policy}"
4

2 に答える 2

4

秘訣は、CGI.escapeの代わりにBase64.urlsafe_encode64を使用することです。

require 'rubygems'
require 'base64'
require 'cgi'
require 'openssl'
require 'json'

handle = ARGV[0]
expiry = Time::now.to_i + 3600
policy = {:handle=>handle, :expiry=>expiry}.to_json
puts policy
puts "\n"
secret = 'SECRET'
encoded_policy = Base64.urlsafe_encode64(policy)
signature = OpenSSL::HMAC.hexdigest('sha256', secret, encoded_policy)
puts "?signature=#{signature}&policy=#{encoded_policy}"

Filepicker.ioドキュメントの有効期限、ハンドル、シークレットのサンプル値でテストすると、Pythonの例と同じ値が返されます。

于 2012-11-29T01:47:55.297 に答える
0

私はRuby1.8環境で、CGI.escapeを削除し、改行を削除することでこれを解決しました。

 Base64.encode64(policy).gsub("\n","")

11armsの答えはRuby1.9ユーザーに最適ですが、Ruby 1.8の場合は、上記のように少し厄介なことをする必要があります。それでも、私たちのほとんどは最近1.9になるか、まもなくそうなるので、私は彼の答えを受け入れます。

于 2012-11-29T23:33:09.703 に答える