[英]Rails — Signing OAuth1 requests
我目前正在嘗試實現一個 api ( http://developers.music-story.com ),其身份驗證使用 OAuth 1.0 技術(請求也已簽名)。 當我創建我的開發帳戶時,他們為我提供了 4 個不同的密鑰,例如:
oauth_consummer_key = some_hexa_str_long_of_40_chars
consummer_secret = some_other_hexa_str_long_of_40_chars
oauth_access_token = some_other_hexa_str_long_of_40_chars
oauth_token_secret = some_other_hexa_str_long_of_40_chars
到目前為止,我一直在嘗試使用在這里和那里找到的一些代碼手動簽署請求, 但沒有成功。 我的理解是簽名必須是請求本身的一種指紋,但我在概念上不確定它,更不用說如何在技術上實現它。
問題:如果我的請求類似於 (?),我的OAuth 1 簽名是什么:
HTTParty.get("http://api.music-story.com/en/show/search?
oauth_signature=I_DONT_KNOW_HOW_TO_GET_THIS
&oauth_token=I_HAVE_THIS_ONE_ALREADY
&name=whatever")
Edit1:這是我到目前為止所嘗試的並引發(無效的 oauth 密鑰消息)api 響應:
oauth_consumer_key = oauth_consummer_key
oauth_nonce = Random.rand(100000).to_s
oauth_signature_method = 'HMAC-SHA1'
oauth_timestamp = Time.now.to_i.to_s
oauth_version = '1.0'
url = "http://api.music-story.com/en/artist/search?"
parameters = 'oauth_consumer_key=' +
oauth_consumer_key +
'&oauth_nonce=' +
oauth_nonce +
'&oauth_signature_method=' +
oauth_signature_method +
'&oauth_timestamp=' +
oauth_timestamp +
'&oauth_version=' +
oauth_version
base_string = 'GET&' + CGI.escape(url) + '&' + CGI.escape(parameters) + '&name=whatever'
secret_key = oauth_token_secret
oauth_signature = CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1',secret_key, base_string)}").chomp)
oauth_token = oauth_access_token
response = HTTParty.get("http://api.music-story.com/en/artist/search?name=someartistname&oauth_signature=#{oauth_signature}&oauth_token=#{oauth_token}")
puts JSON.parse(response.to_json)
# {"root"=>{"version"=>"1.29", "code"=>"-3", "error"=>{"type"=>"OAuthException", "message"=>"Incorrect oauth_signature", "errorcode"=>"40107"}}}
Edit2我還嘗試在oauth_token
和這篇文章的解決方案的末尾添加“&”,但沒有成功。
請賜教!
在我的情況下,問題是在 url 方案的開頭有http://
。 用api.music-story.com...
東西替換查詢的 url 參數api.music-story.com...
對我api.music-story.com...
您可以使用Ruby Oauth 。 這是一個示例
consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {site: "http://api.music-story.com"})
access_token = OAuth::AccessToken.new(consumer, token=oauth_access_token, secret=oauth_token_secret )
response = access_token.get("/en/artist/search?name=someartistname")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.