openssl::random_bytes returns non-word chars, which need to be removed. using alt method to get length ref snippets.dzone.com/posts/show/491
# File lib/geokit/geocoders/yahoo.rb, line 109 def nonce Array.new( 5 ) { rand(256) }.pack('C*').unpack('H*').first end
# File lib/geokit/geocoders/yahoo.rb, line 113 def percent_encode( string ) # ref http://snippets.dzone.com/posts/show/1260 URI.escape( string, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]") ).gsub('*', '%2A') end
sort (very important as it affects the signature), concat, and percent encode @ref oauth.net/core/1.0/#rfc.section.9.1.1 @ref oauth.net/core/1.0/#9.2.1 @ref oauth.net/core/1.0/#rfc.section.A.5.1
# File lib/geokit/geocoders/yahoo.rb, line 134 def query_string pairs = [] @params.sort.each { | key, val | pairs.push( "#{ percent_encode( key ) }=#{ percent_encode( val.to_s ) }" ) } pairs.join '&' end
organize params & create signature
# File lib/geokit/geocoders/yahoo.rb, line 147 def sign( parsed_url ) @params = { 'oauth_consumer_key' => @consumer_key, 'oauth_nonce' => nonce, 'oauth_signature_method' => @sig_method, 'oauth_timestamp' => timestamp, 'oauth_version' => @oauth_version } # if url has query, merge key/values into params obj overwriting defaults if parsed_url.query CGI.parse( parsed_url.query ).each do |k,v| if v.is_a?(Array) && v.count == 1 @params[k] = v.first else @params[k] = v end end end # @ref http://oauth.net/core/1.0/#rfc.section.9.1.2 @req_url = parsed_url.scheme + '://' + parsed_url.host + parsed_url.path # create base str. make it an object attr for ez debugging # ref http://oauth.net/core/1.0/#anchor14 @base_str = [ @req_method, percent_encode( req_url ), # normalization is just x-www-form-urlencoded percent_encode( query_string ) ].join( '&' ) # add signature @params[ 'oauth_signature' ] = signature self end
@ref oauth.net/core/1.0/#rfc.section.9.2
# File lib/geokit/geocoders/yahoo.rb, line 119 def signature key = percent_encode( @consumer_secret ) + '&' + percent_encode( @token_secret ) # ref: http://blog.nathanielbibler.com/post/63031273/openssl-hmac-vs-ruby-hmac-benchmarks digest = OpenSSL::Digest::Digest.new( 'sha1' ) hmac = OpenSSL::HMAC.digest( digest, key, @base_str ) # ref http://groups.google.com/group/oauth-ruby/browse_thread/thread/9110ed8c8f3cae81 Base64.encode64( hmac ).chomp.gsub( /\n/, '' ) end
Generated with the Darkfish Rdoc Generator 2.