2012-05-01 25 views
0

我想用auth.getMobileSession方法來驗證用last.fm REST api生成的last.fm應用程序的用戶。爲last.fm api創建authToken ruby​​

Last.fm說,對於移動應用,我們需要發送AuthToken

authToken (Required) : A 32-byte ASCII hexadecimal MD5 hash of the last.fm username and  the user's password hash. i.e. md5(username + md5(password)), where '+' represents a concatenation. The username supplied should match the string used to generate the authToken. 

這就是我想在紅寶石做:

password = Digest::MD5.hexdigest("my_password") 
auth_token = Digest::MD5.hexdigest("#{user_name}#{password}") 
url_with_params = URI.parse("#{url}?method=auth.getmobilesession&api_key=#{api_key}&username=#{user_name}&authtoken=#{auth_token}&api_sig=#{api_sig}&format=json") 
resp = Net::HTTP.get_response(url_with_params) 
puts JSON.parse(resp.body) 

,我得到的輸出是:

{"error"=>4, "message"=>"Invalid authentication token. Please check username/password supplied"} 

有人可以告訴我,我做錯了什麼?

回答

1

我已經這樣做了,讓我爲你抓住我的代碼。

token = Digest::MD5.hexdigest("#{params[:lfmuser]}#{params[:pass]}") ## given md5 hashed password 
#token = Digest::MD5.hexdigest("#{params[:lfmuser]}#{Digest::MD5.hexdigest(params[:pass])}") ## given plaintext password 

## api_sig is all calls to the api put in alphabetical order, then the apisecret stuck on the end, then md5 hash it all. 
apisig = Digest::MD5.hexdigest("api_key#{@bot.config['lastfm.api_key']}authToken#{token}methodauth.getmobilesessionusername#{params[:lfmuser]}#{@bot.config['lastfm.secret']}") 
opts = {:cache => false} 
xml = @bot.httputil.get_response("#{lastfm_api_url}method=auth.getmobilesession&username=#{CGI.escape params[:lfmuser]}&authToken=#{token}&api_sig=#{apisig}", opts) 
response = Document.new xml.body 
unless response 
    m.reply "could not parse xml from last.fm - omg" 
    return 
end 
if xml.class == Net::HTTPBadRequest 
    m.reply "error from last.fm: #{response.root.elements["error"].text}" 
    return 
end 
## skey is used to do things that need authorization on last.fm, store this however you want 
skey = response.root.elements[1].elements["key"].text 

這是您需要做的基本工作。