2010-05-09 18 views
4

J'essaie d'implémenter une autorisation via Last.fm. Je soumets mes arguments en tant que dictionnaire pour faciliter la signature. Voici le code que je utilise pour signer mes appels:Comment signer des demandes de manière fiable pour l'API 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); 
} 

J'ai vérifié la sortie dans le débogueur, il est exactement comment il devrait être, cependant, je suis encore en train WebExceptions chaque fois que je, ce qui signifie que l'API renvoie "Signature de méthode invalide". Cela signifie qu'il n'accepte pas la signature que SignCall génère.

Voici mon code que j'utilise pour générer l'URL dans le cas où ça vous aidera:

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(); 
} 

et l'utilisation de l'échantillon pour obtenir un SessionKey:

var args = new Dictionary<string, string> 
         { 
          {"method", "auth.getSession"}, 
          {"api_key", ApiKey}, 
          {"token", token} 
         }; 
string url = GetSignedURI(args, true); 

EDIT:

Oh, et le code référence une fonction MD5 implémentée comme ceci:

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")); 
} 

En outre, voici la documentation API: API - Last.fm, avec this page détaillant l'autorisation.

+1

Quelle est l'exception Web spécifique? –

+0

Il retourne la méthode invalide Signature, donc un statut 403. –

Répondre

0

Votre code fonctionne bien pour moi. Ce que je l'ai fait:

  1. Obtenez le jeton: http://ws.audioscrobbler.com/2.0/?method=auth.gettoken&api_key=677626cfada7f04fa80cfd3ad199b109, le jeton retourné était 53c8890afbbf94281931cd11bf28a4e0
  2. Authentifier ce jeton avec l'utilisateur: http://www.last.fm/api/auth?api_key=677626cfada7f04fa80cfd3ad199b109&token=53c8890afbbf94281931cd11bf28a4e0
  3. Utilisez votre code pour obtenir l'URL et télécharger son contenu à l'aide WebClient, qui sont revenus nom d'utilisateur et clé de session.
+0

Vous avez raison, ça a juste commencé à fonctionner. Aucune idée de ce qui est arrivé. Merci quand même. –