如何可靠地为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细节授权。
答
你的代码工作正常,我。我做了什么:
- 获取令牌:http://ws.audioscrobbler.com/2.0/?method=auth.gettoken&api_key=677626cfada7f04fa80cfd3ad199b109,令牌返回为
53c8890afbbf94281931cd11bf28a4e0
- 身份验证与用户令牌:http://www.last.fm/api/auth?api_key=677626cfada7f04fa80cfd3ad199b109&token=53c8890afbbf94281931cd11bf28a4e0
- 使用您的代码来获取URL,然后下载使用
WebClient
它的内容,它返回用户名和会话密钥。
+0
你说得对,它刚开始工作。不知道发生了什么。不管怎么说,还是要谢谢你。 – 2010-05-09 13:27:21
具体是什么网络异常? – 2010-05-09 05:28:20
它返回无效的方法签名,这样一个状态403 – 2010-05-09 09:45:58