Estoy tratando de desarrollar una aplicación simple para interactuar con Tumblr usando las API v2. Puedo ir más allá de cada paso en el flujo de oAuth (gracias a la documentación que se encuentra en Twitter) y obtener un token y un secreto autorizados y autenticados. Pero cuando se trata de publicar, recibo un error 401 no autorizado. Este es el fragmento de código relevante:Publicando en Tumblr usando oAuth y C#
private void post_Click(object sender, System.Windows.RoutedEventArgs e)
{
url = new Uri("http://api.tumblr.com/v2/blog/*myblog*.tumblr.com/post");
Random random = new Random();
nonce = random.Next(1234000, 9999999).ToString();
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
string method = "POST";
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}&", method);
sb.AppendFormat("{0}&", upperCaseUrl(HttpUtility.UrlEncode(url.ToString())));
sb.AppendFormat("body%3D{0}%26", upperCaseUrl(HttpUtility.UrlEncode(textBox.Text)));
sb.AppendFormat("oauth_consumer_key%3D{0}%26", consumerKey);
sb.AppendFormat("oauth_nonce%3D{0}%26", nonce);
sb.AppendFormat("oauth_signature_method%3D{0}%26", "HMAC-SHA1");
sb.AppendFormat("oauth_timestamp%3D{0}%26", timestamp);
sb.AppendFormat("oauth_token%3D{0}%26", token);
sb.AppendFormat("oauth_version%3D{0}%26", "1.0");
sb.AppendFormat("type%3D{0}", "text");
System.Diagnostics.Debug.WriteLine(sb.ToString());
string signingKey = consumerSecret + '&' + secret;
HMACSHA1 signing = new HMACSHA1(Encoding.ASCII.GetBytes(signingKey));
byte[] bytearray = Encoding.ASCII.GetBytes(sb.ToString());
MemoryStream stream = new MemoryStream(bytearray);
signature = Convert.ToBase64String(signing.ComputeHash(stream));
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
StringBuilder header = new StringBuilder();
header.Append("OAuth ");
header.AppendFormat("oauth_consumer_key=\"{0}\", ", consumerKey);
header.AppendFormat("oauth_token=\"{0}\", ", token);
header.AppendFormat("oauth_nonce=\"{0}\", ", nonce);
header.AppendFormat("oauth_timestamp=\"{0}\", ", timestamp);
header.AppendFormat("oauth_signature_method=\"{0}\", ", "HMAC-SHA1");
header.AppendFormat("oauth_version=\"{0}\", ", "1.0");
header.AppendFormat("oauth_signature=\"{0}\"", upperCaseUrl(HttpUtility.UrlEncode(signature)));
System.Diagnostics.Debug.WriteLine(header.ToString());
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
request.Headers.Add("Authorization", header.ToString());
try
{
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(response.GetResponseStream());
if (reader.ReadToEnd() == "201: Created")
{
control.Invoke((MethodInvoker)delegate
{
statusText.Text = "Post successfully sent!";
});
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
La función se llama cuando se hace clic en un botón y obtener el cuerpo del texto de un cuadro de texto. La parte de firma es correcta porque ha sido probada con otros servicios (Twitter, etc.) y todavía proporciona firmas válidas para Tumblr. El encabezado Autorización es prácticamente el mismo que he usado para solicitar un token y autorizarlo, y la cadena base solo contiene el tipo del contenido (texto en este caso) y el cuerpo, además de los parámetros estándar oauth_ *. También verifiqué el código con las herramientas disponibles en hueniverse.com, pero aún nada.
Probablemente me falta un encabezado HTTP o estoy PUBLICANDO la solicitud incorrecta. ¿Algunas ideas? Gracias.
Cualquier actualización sobre cómo arreglaste? Tengo un problema similar. Sigue recibiendo 401 de Tumblr, pero no estás seguro de por qué. –
Tiene el mismo problema ... ¿Ha logrado arreglarlo (y cómo)? – SimpleVar