我正在尝试通过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 - Last.fm文档,其中包含详细说明授权的this page。
发布于 2010-05-09 13:20:52
你的代码对我来说工作得很好。我做了什么:
获取令牌: URL,返回的令牌为53c8890afbbf94281931cd11bf28a4e0
WebClient
下载其内容。https://stackoverflow.com/questions/2796422
复制相似问题