From 70d6d55e0cf1e01811668a81a1aa91d02db37600 Mon Sep 17 00:00:00 2001 From: 404 Date: Mon, 2 Jul 2012 18:07:11 +0800 Subject: [PATCH 1/3] added Qiniu::RS.generate_upload_token() --- Gemfile.lock | 2 +- lib/qiniu/rs.rb | 4 ++++ lib/qiniu/rs/auth.rb | 2 +- lib/qiniu/rs/config.rb | 2 -- lib/qiniu/rs/utils.rb | 28 +++++++++++++++++++++++----- lib/qiniu/rs/version.rb | 2 +- spec/qiniu/rs_spec.rb | 8 ++++++++ 7 files changed, 38 insertions(+), 10 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d28949b..89628a1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - qiniu-rs (2.0.5) + qiniu-rs (2.1.0) json (~> 1.7.3) mime-types (~> 1.19) rest-client (~> 1.6.7) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 7fe6f9f..542ba8c 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -115,6 +115,10 @@ module Qiniu Image.preivew_url(url, spec) end + def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) + Utils.generate_upload_token(scope, expires_in, callback_url, return_url) + end + end end diff --git a/lib/qiniu/rs/auth.rb b/lib/qiniu/rs/auth.rb index ff7aca8..99400f0 100755 --- a/lib/qiniu/rs/auth.rb +++ b/lib/qiniu/rs/auth.rb @@ -59,7 +59,7 @@ module Qiniu end def call_with_signature(url, data, retry_times = 0) - code, data = http_request url, data, {:signature_auth => true} + code, data = http_request url, data, {:qbox_signature_token => generate_qbox_signature(url, data)} [code, data] end diff --git a/lib/qiniu/rs/config.rb b/lib/qiniu/rs/config.rb index 28e5a73..8a03a8e 100755 --- a/lib/qiniu/rs/config.rb +++ b/lib/qiniu/rs/config.rb @@ -21,9 +21,7 @@ module Qiniu :content_type => 'application/x-www-form-urlencoded', :auth_url => "https://acc.qbox.me/oauth2/token", :rs_host => "http://rs.qbox.me:10100", - #:rs_host => "http://localhost:10100", :io_host => "http://iovip.qbox.me", - #:io_host => "http://localhost:10200", :client_id => "a75604760c4da4caaa456c0c5895c061c3065c5a", :client_secret => "75df554a39f58accb7eb293b550fa59618674b7d", :access_key => "", diff --git a/lib/qiniu/rs/utils.rb b/lib/qiniu/rs/utils.rb index 0175524..04ee1d9 100755 --- a/lib/qiniu/rs/utils.rb +++ b/lib/qiniu/rs/utils.rb @@ -38,12 +38,15 @@ module Qiniu :accept => :json, :user_agent => Config.settings[:user_agent] } - if options[:signature_auth] && options[:signature_auth] == true - signature_token = generate_qbox_signature(Config.settings[:access_key], Config.settings[:secret_key], url, data) - header_options.merge!('Authorization' => "QBox #{signature_token}") + auth_token = nil + if !options[:qbox_signature_token].nil? && !options[:qbox_signature_token].empty? + auth_token = 'QBox ' + options[:qbox_signature_token] + #elsif !options[:upload_signature_token].nil? && !options[:upload_signature_token].empty? + # auth_token = 'UpToken ' + options[:upload_signature_token] elsif options[:access_token] - header_options.merge!('Authorization' => "Bearer #{options[:access_token]}") + auth_token = 'Bearer ' + options[:access_token] end + header_options.merge!('Authorization' => auth_token) unless auth_token.nil? case options[:method] when :get response = RestClient.get url, header_options @@ -130,7 +133,9 @@ module Qiniu File.open(filepath, "rb") { |f| Zlib.crc32 f.read } end - def generate_qbox_signature(access_key, secret_key, url, params) + def generate_qbox_signature(url, params) + access_key = Config.settings[:access_key] + secret_key = Config.settings[:secret_key] uri = URI.parse(url) signature = uri.path query_string = uri.query @@ -146,6 +151,19 @@ module Qiniu %Q(#{access_key}:#{encoded_digest}) end + def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) + access_key = Config.settings[:access_key] + secret_key = Config.settings[:secret_key] + params = {:scope => scope, :deadline => Time.now.to_i + expires_in} + params[:callbackUrl] = callback_url if !callback_url.nil? && !calback_url.empty? + params[:returnUrl] = return_url if !return_url.nil? && !return_url.empty? + signature = urlsafe_base64_encode(params.to_json) + hmac = HMAC::SHA1.new(secret_key) + hmac.update(signature) + encoded_digest = urlsafe_base64_encode(hmac.digest) + %Q(#{access_key}:#{encoded_digest}:#{signature}) + end + end end end diff --git a/lib/qiniu/rs/version.rb b/lib/qiniu/rs/version.rb index 2319bbd..3bd533a 100755 --- a/lib/qiniu/rs/version.rb +++ b/lib/qiniu/rs/version.rb @@ -2,6 +2,6 @@ module Qiniu module RS - VERSION = "2.0.5" + VERSION = "2.1.0" end end diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index 61ac14e..c28bfe7 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -149,5 +149,13 @@ module Qiniu end end + context ".generate_upload_token" do + it "should works" do + data = Qiniu::RS.generate_upload_token('test_bucket', 3600) + data.should_not be_empty + puts data.inspect + end + end + end end From f8c3f93d297567f301d55ccfda3abf23a6d684ed Mon Sep 17 00:00:00 2001 From: 404 Date: Mon, 2 Jul 2012 18:18:34 +0800 Subject: [PATCH 2/3] updated README --- Gemfile.lock | 2 +- README.md | 2 +- lib/qiniu/rs/version.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 89628a1..8b53951 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - qiniu-rs (2.1.0) + qiniu-rs (2.1.1) json (~> 1.7.3) mime-types (~> 1.19) rest-client (~> 1.6.7) diff --git a/README.md b/README.md index c62a48d..2d420d8 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Qiniu Resource (Cloud) Storage SDK for Ruby - [![Build Status](https://secure.travis-ci.org/why404/qiniu-rs.png?branch=master)](http://travis-ci.org/why404/qiniu-rs) [![Dependency Status](https://gemnasium.com/why404/qiniu-rs.png)](https://gemnasium.com/why404/qiniu-rs) +# Qiniu Resource (Cloud) Storage SDK for Ruby - [![Build Status](https://secure.travis-ci.org/why404/qiniu-rs-for-ruby.png?branch=master)](http://travis-ci.org/why404/qiniu-rs-for-ruby) [![Dependency Status](https://gemnasium.com/why404/qiniu-rs-for-ruby.png)](https://gemnasium.com/why404/qiniu-rs-for-ruby) # 关于 diff --git a/lib/qiniu/rs/version.rb b/lib/qiniu/rs/version.rb index 3bd533a..d911083 100755 --- a/lib/qiniu/rs/version.rb +++ b/lib/qiniu/rs/version.rb @@ -2,6 +2,6 @@ module Qiniu module RS - VERSION = "2.1.0" + VERSION = "2.1.1" end end From c60cc6e4b8d64ce97ab06b87210b3681f1e36c86 Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 3 Jul 2012 16:29:41 +0800 Subject: [PATCH 3/3] updated Qiniu::RS.generate_upload_token() --- Gemfile.lock | 2 +- lib/qiniu/rs.rb | 18 ++++++++++++++-- lib/qiniu/rs/utils.rb | 2 ++ lib/qiniu/rs/version.rb | 2 +- lib/qiniu/tokens/access_token.rb | 23 ++++++++++++++++++++ lib/qiniu/tokens/qbox_token.rb | 37 ++++++++++++++++++++++++++++++++ lib/qiniu/tokens/upload_token.rb | 37 ++++++++++++++++++++++++++++++++ spec/qiniu/rs_spec.rb | 2 +- 8 files changed, 118 insertions(+), 5 deletions(-) create mode 100755 lib/qiniu/tokens/access_token.rb create mode 100755 lib/qiniu/tokens/qbox_token.rb create mode 100755 lib/qiniu/tokens/upload_token.rb diff --git a/Gemfile.lock b/Gemfile.lock index 8b53951..efdbd99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - qiniu-rs (2.1.1) + qiniu-rs (2.1.2) json (~> 1.7.3) mime-types (~> 1.19) rest-client (~> 1.6.7) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 542ba8c..4f06cab 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -12,6 +12,9 @@ module Qiniu autoload :IO, 'qiniu/rs/io' autoload :RS, 'qiniu/rs/rs' autoload :Image, 'qiniu/rs/image' + autoload :AccessToken, 'qiniu/tokens/access_token' + autoload :QboxToken, 'qiniu/tokens/qbox_token' + autoload :UploadToken, 'qiniu/tokens/upload_token' class << self @@ -115,8 +118,19 @@ module Qiniu Image.preivew_url(url, spec) end - def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) - Utils.generate_upload_token(scope, expires_in, callback_url, return_url) + #def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) + # Utils.generate_upload_token(scope, expires_in, callback_url, return_url) + #end + + def generate_upload_token(opts = {}) + token_obj = UploadToken.new(opts) + token_obj.access_key = Config.settings[:access_key] + token_obj.secret_key = Config.settings[:secret_key] + #token_obj.scope = opts[:scope] + #token_obj.expires_in = opts[:expires_in] + #token_obj.callback_url = opts[:callback_url] + #token_obj.return_url = opts[:return_url] + token_obj.generate_token end end diff --git a/lib/qiniu/rs/utils.rb b/lib/qiniu/rs/utils.rb index 04ee1d9..272115b 100755 --- a/lib/qiniu/rs/utils.rb +++ b/lib/qiniu/rs/utils.rb @@ -151,6 +151,7 @@ module Qiniu %Q(#{access_key}:#{encoded_digest}) end +=begin def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) access_key = Config.settings[:access_key] secret_key = Config.settings[:secret_key] @@ -163,6 +164,7 @@ module Qiniu encoded_digest = urlsafe_base64_encode(hmac.digest) %Q(#{access_key}:#{encoded_digest}:#{signature}) end +=end end end diff --git a/lib/qiniu/rs/version.rb b/lib/qiniu/rs/version.rb index d911083..b13923f 100755 --- a/lib/qiniu/rs/version.rb +++ b/lib/qiniu/rs/version.rb @@ -2,6 +2,6 @@ module Qiniu module RS - VERSION = "2.1.1" + VERSION = "2.1.2" end end diff --git a/lib/qiniu/tokens/access_token.rb b/lib/qiniu/tokens/access_token.rb new file mode 100755 index 0000000..78aa99a --- /dev/null +++ b/lib/qiniu/tokens/access_token.rb @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- + +require 'hmac-sha1' +require 'qiniu/rs/config' +require 'qiniu/rs/utils' + +module Qiniu + module RS + class AccessToken + + include Utils + + attr_accessor :access_key, :secret_key + + def generate_encoded_digest(signature) + hmac = HMAC::SHA1.new(@secret_key) + hmac.update(signature) + urlsafe_base64_encode(hmac.digest) + end + + end + end +end diff --git a/lib/qiniu/tokens/qbox_token.rb b/lib/qiniu/tokens/qbox_token.rb new file mode 100755 index 0000000..4c9ef4f --- /dev/null +++ b/lib/qiniu/tokens/qbox_token.rb @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- + +require 'json' +require 'qiniu/tokens/access_token' + +module Qiniu + module RS + class QboxToken < AccessToken + + attr_accessor :url, :params + + def initialize(opts = {}) + @url = opts[:url] + @params = opts[:params] + end + + def generate_signature + uri = URI.parse(@url) + signature = uri.path + query_string = uri.query + signature += '?' + query_string if !query_string.nil? && !query_string.empty? + signature += "\n"; + if @params.is_a?(Hash) + total_param = @params.map { |key, value| key.to_s+"="+value.to_s } + signature += total_param.join("&") + end + signature + end + + def generate_token + encoded_digest = generate_encoded_digest(signature) + %Q(#{@access_key}:#{encoded_digest}) + end + + end + end +end diff --git a/lib/qiniu/tokens/upload_token.rb b/lib/qiniu/tokens/upload_token.rb new file mode 100755 index 0000000..3847607 --- /dev/null +++ b/lib/qiniu/tokens/upload_token.rb @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- + +require 'json' +require 'qiniu/tokens/access_token' +require 'qiniu/rs/utils' + +module Qiniu + module RS + class UploadToken < AccessToken + + include Utils + + attr_accessor :scope, :expires_in, :callback_url, :return_url + + def initialize(opts = {}) + @scope = opts[:scope] + @expires_in = opts[:expires_in] + @callback_url = opts[:callback_url] + @return_url = opts[:return_url] + end + + def generate_signature + params = {:scope => @scope, :deadline => Time.now.to_i + @expires_in} + params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@calback_url.empty? + params[:returnUrl] = @return_url if !@return_url.nil? && !@return_url.empty? + urlsafe_base64_encode(params.to_json) + end + + def generate_token + signature = generate_signature + encoded_digest = generate_encoded_digest(signature) + %Q(#{@access_key}:#{encoded_digest}:#{signature}) + end + + end + end +end diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index c28bfe7..df47efe 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -151,7 +151,7 @@ module Qiniu context ".generate_upload_token" do it "should works" do - data = Qiniu::RS.generate_upload_token('test_bucket', 3600) + data = Qiniu::RS.generate_upload_token({:scope => 'test_bucket', :expires_in => 3600}) data.should_not be_empty puts data.inspect end