restrequest bearer c# oauth twitter twitter-oauth restsharp

c# - bearer - token web api



RestSharp y Twitter API 1.1: ¿Cómo puedo URLEncode el texto de actualización de estado? (1)

¿Has intentado utilizar la clase HttpUtility integrada en .NET Framework? Puede encontrarlo en el espacio de nombres System.Web.

string urlEncodedText = HttpUtility.UrlEncode("Your text goes here");

MSDN

Este es definitivamente un problema de RestSharp ... Jugué con él por un tiempo y el problema es que no hay forma de deshabilitar la codificación porcentual estándar ...

void Main() { var ProtectedChars = "0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A".Replace(" 0x", "%").Split('',''); var client = new RestClient("https://api.twitter.com"); client.Authenticator = OAuth1Authenticator.ForProtectedResource( "_consumerKey", "_consumerSecret", "_accessToken", "_accessTokenSecret" ); var status = "Dogs, Cats & Mice"; string newStatus = string.Empty; foreach (char c in status) { var charBytes = Encoding.UTF8.GetBytes(c.ToString()); var tempText = string.Empty; for (int i = 0; i < charBytes.Count(); i++) { byte b = charBytes[i]; string hex = "%" + b.ToString("X2"); tempText += hex; } if (ProtectedChars.Any(x => x == tempText)) { newStatus += c; } else { newStatus += string.Format("{0:X2}", tempText); } } var request = new RestRequest("/1.1/statuses/update.json", Method.POST); request.AddParameter(new Parameter{ Name = "status", Type = ParameterType.GetOrPost, Value = newStatus } ); var response = client.Execute(request); }

En Fiddler he estado monitoreando las solicitudes que van a Twitter ... y esto es lo que encontré ...

POST https://api.twitter.com/1.1/statuses/update.json HTTP/1.1 Authorization: /* auth data */ Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml User-Agent: RestSharp/104.4.0.0 Content-Type: application/x-www-form-urlencoded Host: api.twitter.com Content-Length: 44 Accept-Encoding: gzip, deflate status=Dogs%252C%2520Cats%2520%2526%2520Mice

El problema con la Solicitud de Http es el cuerpo de nuestra solicitud ... si no se hubiera tocado el valor que yo había proporcionado ... entonces Twitter habría reconocido el mensaje y actualizado nuestro estado para nosotros ...

status=Dogs%252C%2520Cats%2520%2526%2520Mice <--- Altered by RestSharp status=Dogs%2C%20Cats%20%26%20Mice <--- What I initially sent

Intento publicar un estado de Twitter desde mi aplicación web, utilizando RestSharp . El siguiente código funciona perfectamente:

var status = "I am fine with posting this status."; var client = new RestClient("https://api.twitter.com"); // The OAuth keys/tokens/secrets are retrieved elsewhere client.Authenticator = OAuth1Authenticator.ForProtectedResource( _consumerKey, _consumerSecret, _accessToken, _accessTokenSecret ); var request = new RestRequest("/1.1/statuses/update.json", Method.POST); request.AddParameter("status", status, ParameterType.GetOrPost); var response = client.Execute(request);

Sin embargo, este código falla con un error de autenticación si incluyo alguno de los siguientes caracteres en el texto de estado:! ! * '' ( )

A través de muchos foros de pesca, deduje que esto tiene algo que ver con la codificación de firma OAuth que no coincide con la codificación de los parámetros POST. Encontré esta pregunta en SO , pero buscar en los problemas de RestSharp en GitHub no revela nada útil.

Puedo ver algún código en la fuente RestSharp ( UrlEncodeRelaxed ) que parece estar codificando manualmente ese conjunto particular de caracteres para cumplir con las especificaciones de codificación OAuth, así que he intentado codificar manualmente esos caracteres en mi estado de la misma manera (con código tomado de RestSharp) antes de pasarlo, por ejemplo:

var status = "I''m NOT fine with posting this status."; string[] UriRfc3986CharsToEscape = new[] { "!", "*", "''", "(", ")" }; string[] UriRfc3968EscapedHex = new[] { "%21", "%2A", "%27", "%28", "%29" }; for (var i = 0; i < UriRfc3986CharsToEscape.Length; i++) status = status.Replace(UriRfc3986CharsToEscape[i], UriRfc3968EscapedHex[i]);

Pero esto tampoco funciona (todavía obtengo el error de autenticación).

¿Cuál es el problema aquí y qué debo hacer para codificar correctamente el estado? ¿O es esto un error RestSharp?