我試圖通過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細節授權。
具體是什麼網絡異常? – 2010-05-09 05:28:20
它返回無效的方法簽名,這樣一個狀態403 – 2010-05-09 09:45:58