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

时间:2010-05-09 02:38:07

标签: c# linq md5

我正在尝试通过Last.fm实现授权。我将我的论据作为字典提交,以使签名更容易。这是我用来签署电话的代码:

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正在生成。

这是我用来生成URL的代码,以防它有用:

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.fmthis page详细说明授权。

1 个答案:

答案 0 :(得分: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. 对该令牌进行身份验证
  4. 使用您的代码获取URL,然后使用返回用户名和会话密钥的WebClient下载其内容。