如何可靠地为Last.fm api签名请求?

问题描述:

我试图通过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

你的代码工作正常,我。我做了什么:

  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