2010-05-09 59 views
4

我試圖通過Last.fm來實現授權。我將我的參數作爲字典提交,以使簽名更容易。這是我使用我簽字調用的代碼:如何可靠地爲Last.fm api簽名請求?

public static string SignCall(Dictionary<string, string> args) 
{ 
    IOrderedEnumerable<KeyValuePair<string, string>> sortedArgs = args.OrderBy(arg => arg.Key); 
    string signature = 
     sortedArgs.Select(pair => pair.Key + pair.Value). 
     Aggregate((first, second) => first + second); 
    return MD5(signature + SecretKey); 
} 

我已經檢查在調試器的輸出,這也正是它應該的,但是,我還是每次我試圖讓WebExceptions,這意味着API返回「無效方法簽名」。這意味着它不接受SignCall正在生成的簽名。

這裏是我的代碼,我用它來生成在案件的網址,它會幫助:

public static string GetSignedURI(Dictionary<string, string> args, bool get) 
{ 
    var stringBuilder = new StringBuilder(); 
    if (get) 
     stringBuilder.Append("http://ws.audioscrobbler.com/2.0/?"); 
    foreach (var kvp in args) 
     stringBuilder.AppendFormat("{0}={1}&", kvp.Key, kvp.Value); 
    stringBuilder.Append("api_sig="+SignCall(args)); 
    return stringBuilder.ToString(); 
} 

而且樣品使用獲得SessionKey:

var args = new Dictionary<string, string> 
         { 
          {"method", "auth.getSession"}, 
          {"api_key", ApiKey}, 
          {"token", token} 
         }; 
string url = GetSignedURI(args, true); 

編輯:

哦,和代碼引用這樣實現的MD5函數:

public static string MD5(string toHash) 
{ 
    byte[] textBytes = Encoding.UTF8.GetBytes(toHash); 
    var cryptHandler = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
    byte[] hash = cryptHandler.ComputeHash(textBytes); 
    return hash.Aggregate("", (current, a) => current + a.ToString("x2")); 
} 

而且,這裏的API文檔:API - Last.fm,與this page細節授權。

+1

具體是什麼網絡異常? – 2010-05-09 05:28:20

+0

它返回無效的方法簽名,這樣一個狀態403 – 2010-05-09 09:45:58

回答

0

你的代碼工作正常,我。我做了什麼:

  1. 獲取令牌:http://ws.audioscrobbler.com/2.0/?method=auth.gettoken&api_key=677626cfada7f04fa80cfd3ad199b109,令牌返回爲53c8890afbbf94281931cd11bf28a4e0
  2. 身份驗證與用戶令牌:http://www.last.fm/api/auth?api_key=677626cfada7f04fa80cfd3ad199b109&token=53c8890afbbf94281931cd11bf28a4e0
  3. 使用您的代碼來獲取URL,然後下載使用WebClient它的內容,它返回用戶名和會話密鑰。
+0

你說得對,它剛開始工作。不知道發生了什麼。不管怎麼說,還是要謝謝你。 – 2010-05-09 13:27:21