2012-10-03 28 views
5

Estoy tratando de crear un cliente para el nuevo protocolo tent.io que se está desarrollando y están usando el esquema HTTP MAC Oauth2 descrito por http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01.HTTP MAC Autenticación usando C#

He escrito un método simple en C# que crea el encabezado Autorización, pero cuando envío mi solicitud obtengo un error simple de "firma MAC no válida".

Como no tengo una implementación de referencia, estoy luchando para descubrir qué hay de malo en mi código. Lo estoy publicando aquí con la esperanza de que alguien pueda detectar mi error.

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

Crío cabecera completa utilizando el valor devuelto y se ve algo lke este

Autorización: MAC id = "a: dfsdfa2", ct = "1349277638", nonce = "1469030797", mac = "ibZ/HXaoz2VgBer3CK7K9vu0po3K + E36K + TQ9Sgcw6o ="

Estoy seguro de que me falta algo pequeño, pero no puedo verlo.

¡Cualquier ayuda sería muy apreciada!

+0

Necesita volver a formatear su código –

Respuesta

3

Resulta que el código anterior es perfecto, pero yo estaba pasando el valor método HTTP mal en ella!

¡Donde obtenía el error, estaba POSTANDO JSON, pero en realidad había puesto "GET" en el GetAuthorizationMethod!

Una vez que lo corrigí, obtuve un valor access_token de Tent.is.

Cuestiones relacionadas