2012-10-03 13 views
5

Sto provando a creare un client per il nuovo protocollo tent.io in fase di sviluppo e stanno utilizzando lo schema HTTP MAC Oauth2 descritto da http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01.Autenticazione MAC HTTP con C#

Ho scritto un semplice metodo in C# che crea l'intestazione Autorizzazione, ma quando invio la mia richiesta ottengo un semplice errore "Firma MAC non valida".

Poiché non ho un'implementazione di riferimento, sto cercando di capire cosa c'è di sbagliato nel mio codice. Sto postando qui nella speranza che qualcuno possa individuare il mio errore.

public string GetAuthorizationHeader(string macKeyIdentifier, string macKey, string macAlgorithm, string method, Uri uri) 
{ 
    TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1)); 
    string timestamp = ((int)t.TotalSeconds).ToString(); 

    string nonce = new Random().Next().ToString(); 

    string normalizedString = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n\n", 
              timestamp, 
              nonce, 
              method, 
              uri.PathAndQuery, 
              uri.Host, 
              uri.Port); 

    HashAlgorithm hashGenerator = null; 
    if (macAlgorithm == "hmac-sha-256") 
    { 
     hashGenerator = new HMACSHA256(Encoding.ASCII.GetBytes(macKey)); 
    } 
    else if (macAlgorithm == "hmac-sha-1") 
    { 
     hashGenerator = new HMACSHA1(Encoding.ASCII.GetBytes(macKey)); 
    } 
    else 
    { 
     throw new InvalidOperationException("Unsupported MAC algorithm"); 
    } 

    string hash = System.Convert.ToBase64String(hashGenerator.ComputeHash(Encoding.ASCII.GetBytes(normalizedString))); 

    StringBuilder authorizationHeader = new StringBuilder(); 
    authorizationHeader.AppendFormat(@"id=""{0}"",ts=""{1}"",nonce=""{2}"",mac=""{3}""", 
            macKeyIdentifier, timestamp, nonce, hash); 

    return authorizationHeader.ToString(); 
} 

ho creare l'intestazione completa utilizzando il valore restituito e sembra qualcosa lke questo

Autorizzazione: MAC id = "a: dfsdfa2", ts = "1.349.277,638 mila", nonce = "1.469.030,797 mila", mac = "ibZ/HXaoz2VgBer3CK7K9vu0po3K + E36K + TQ9Sgcw6o ="

Sono sicuro che mi manca qualcosa di piccolo, ma non riesco a vederlo.

Qualsiasi aiuto sarebbe molto apprezzato!

+0

È necessario riformattare il codice –

risposta

3

Si scopre che il codice di cui sopra è perfetto, ma mi stava passando il valore metodo HTTP sbagliato in esso!

Dove stavo ottenendo l'errore, stavo POST'ing JSON, ma in realtà avevo messo "GET" nel GetAuthorizationMethod!

Una volta corretto, ho ricevuto un valore access_token da Tent.is.

Problemi correlati