51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
# File 'lib/rdio/simple_om.rb', line 51
def self.om(consumer, url, post_params, token=nil, method='POST', realm=nil)
method.upcase!
params = post_params.is_a?(Array) ? post_params : post_params.to_a
url = URI.parse(url)
url.scheme = url.scheme.downcase
url.user = url.password = nil
url.host.downcase!
if url.query
CGI.parse(url.query).each { |k,vs| vs.each { |v| params.push([k,v]) } }
end
url.query = nil
url.fragment = nil
params = params + [
['oauth_version', '1.0'],
['oauth_timestamp', Time.now.to_i.to_s],
['oauth_nonce', rand(1000000).to_s],
['oauth_signature_method', 'HMAC-SHA1'],
['oauth_consumer_key', consumer[0]],
]
hmac_key = consumer[1] + '&'
if token != nil
params.push ['oauth_token', token[0]]
hmac_key += token[1]
end
params.sort!
normalized_params = (params.collect {|p| percent_encode(p[0])+'='+percent_encode(p[1])}).join '&'
signature_base_string = (percent_encode(method) +
'&' + percent_encode(url.to_s) +
'&' + percent_encode(normalized_params))
hmac = Digest::HMAC.new(hmac_key, Digest::SHA1)
hmac.update(signature_base_string)
oauth_signature = [hmac.digest].pack('m0').strip
if realm
authorization_params = [['realm', realm]]
else
authorization_params = []
end
authorization_params.push(['oauth_signature', oauth_signature])
oauth_params = ['oauth_version', 'oauth_timestamp', 'oauth_nonce',
'oauth_signature_method', 'oauth_signature',
'oauth_consumer_key', 'oauth_token']
authorization_params.concat(params.select { |param| nil != oauth_params.index(param[0]) })
return 'OAuth ' + (authorization_params.collect {|param| '%s="%s"' % param}).join(', ')
end
|