Mercurial > altnet-hispano
diff Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs @ 90:d1688622fa88
Autenticando con twitter (falta emprolijar el código, pero autentica!)
author | Nelo@Kenia.neluz.int |
---|---|
date | Fri, 03 Jun 2011 21:35:59 -0300 |
parents | |
children | db4b1e2cae49 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs Fri Jun 03 21:35:59 2011 -0300 @@ -0,0 +1,275 @@ +using System; +using System.Configuration; +using System.Web; +using System.Net; +using System.IO; +using System.Collections.Specialized; + +namespace AltNetHispano.Agendas.Twitter +{ + public class oAuthTwitter : OAuthBase + { + public enum Method { GET, POST, DELETE }; + public const string REQUEST_TOKEN = "http://twitter.com/oauth/request_token"; + public const string AUTHORIZE = "http://twitter.com/oauth/authorize"; + public const string ACCESS_TOKEN = "http://twitter.com/oauth/access_token"; + + private string _consumerKey = ""; + private string _consumerSecret = ""; + private string _token = ""; + private string _tokenSecret = ""; + private string _callBackUrl = "oob"; + private string _oauthVerifier = ""; + + +#region Properties + public string ConsumerKey + { + get + { + if (_consumerKey.Length == 0) + { + _consumerKey = ConfigurationManager.AppSettings["consumerKey"]; + } + return _consumerKey; + } + set { _consumerKey = value; } + } + + public string ConsumerSecret { + get { + if (_consumerSecret.Length == 0) + { + _consumerSecret = ConfigurationManager.AppSettings["consumerSecret"]; + } + return _consumerSecret; + } + set { _consumerSecret = value; } + } + + public string Token { get { return _token; } set { _token = value; } } + public string TokenSecret { get { return _tokenSecret; } set { _tokenSecret = value; } } + public string CallBackUrl { get { return _callBackUrl; } set { _callBackUrl = value; } } + public string OAuthVerifier { get { return _oauthVerifier; } set { _oauthVerifier = value; } } + +#endregion + + /// <summary> + /// Get the link to Twitter's authorization page for this application. + /// </summary> + /// <returns>The url with a valid request token, or a null string.</returns> + public string AuthorizationLinkGet() + { + string ret = null; + + string response = oAuthWebRequest(Method.GET, REQUEST_TOKEN, String.Empty); + if (response.Length > 0) + { + //response contains token and token secret. We only need the token. + NameValueCollection qs = HttpUtility.ParseQueryString(response); + + if (qs["oauth_callback_confirmed"] != null) + { + if (qs["oauth_callback_confirmed"] != "true") + { + throw new Exception("OAuth callback not confirmed."); + } + } + + if (qs["oauth_token"] != null) + { + ret = AUTHORIZE + "?oauth_token=" + qs["oauth_token"]; + } + } + return ret; + } + + /// <summary> + /// Exchange the request token for an access token. + /// </summary> + /// <param name="authToken">The oauth_token is supplied by Twitter's authorization page following the callback.</param> + /// <param name="oauthVerifier">An oauth_verifier parameter is provided to the client either in the pre-configured callback URL</param> + public void AccessTokenGet(string authToken, string oauthVerifier) + { + this.Token = authToken; + this.OAuthVerifier = oauthVerifier; + + string response = oAuthWebRequest(Method.GET, ACCESS_TOKEN, String.Empty); + + if (response.Length > 0) + { + //Store the Token and Token Secret + NameValueCollection qs = HttpUtility.ParseQueryString(response); + if (qs["oauth_token"] != null) + { + this.Token = qs["oauth_token"]; + } + if (qs["oauth_token_secret"] != null) + { + this.TokenSecret = qs["oauth_token_secret"]; + } + } + } + + /// <summary> + /// Submit a web request using oAuth. + /// </summary> + /// <param name="method">GET or POST</param> + /// <param name="url">The full url, including the querystring.</param> + /// <param name="postData">Data to post (querystring format)</param> + /// <returns>The web server response.</returns> + public string oAuthWebRequest(Method method, string url, string postData) + { + string outUrl = ""; + string querystring = ""; + string ret = ""; + + + //Setup postData for signing. + //Add the postData to the querystring. + if (method == Method.POST || method == Method.DELETE) + { + if (postData.Length > 0) + { + //Decode the parameters and re-encode using the oAuth UrlEncode method. + NameValueCollection qs = HttpUtility.ParseQueryString(postData); + postData = ""; + foreach (string key in qs.AllKeys) + { + if (postData.Length > 0) + { + postData += "&"; + } + qs[key] = HttpUtility.UrlDecode(qs[key]); + qs[key] = this.UrlEncode(qs[key]); + postData += key + "=" + qs[key]; + + } + if (url.IndexOf("?") > 0) + { + url += "&"; + } + else + { + url += "?"; + } + url += postData; + } + } + + Uri uri = new Uri(url); + + string nonce = this.GenerateNonce(); + string timeStamp = this.GenerateTimeStamp(); + + //Generate Signature + string sig = this.GenerateSignature(uri, + this.ConsumerKey, + this.ConsumerSecret, + this.Token, + this.TokenSecret, + this.CallBackUrl, + this.OAuthVerifier, + method.ToString(), + timeStamp, + nonce, + out outUrl, + out querystring); + + querystring += "&oauth_signature=" + this.UrlEncode(sig); + + //Convert the querystring to postData + if (method == Method.POST || method == Method.DELETE) + { + postData = querystring; + querystring = ""; + } + + if (querystring.Length > 0) + { + outUrl += "?"; + } + + ret = WebRequest(method, outUrl + querystring, postData); + + return ret; + } + + /// <summary> + /// Web Request Wrapper + /// </summary> + /// <param name="method">Http Method</param> + /// <param name="url">Full url to the web resource</param> + /// <param name="postData">Data to post in querystring format</param> + /// <returns>The web server response.</returns> + public string WebRequest(Method method, string url, string postData) + { + HttpWebRequest webRequest = null; + StreamWriter requestWriter = null; + string responseData = ""; + + webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; + webRequest.Method = method.ToString(); + webRequest.ServicePoint.Expect100Continue = false; + //webRequest.UserAgent = "Identify your application please."; + //webRequest.Timeout = 20000; + + if (method == Method.POST || method == Method.DELETE) + { + webRequest.ContentType = "application/x-www-form-urlencoded"; + + //POST the data. + requestWriter = new StreamWriter(webRequest.GetRequestStream()); + try + { + requestWriter.Write(postData); + } + catch + { + throw; + } + finally + { + requestWriter.Close(); + requestWriter = null; + } + } + + responseData = WebResponseGet(webRequest); + + webRequest = null; + + return responseData; + + } + + /// <summary> + /// Process the web response. + /// </summary> + /// <param name="webRequest">The request object.</param> + /// <returns>The response data.</returns> + public string WebResponseGet(HttpWebRequest webRequest) + { + StreamReader responseReader = null; + string responseData = ""; + + try + { + responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream()); + responseData = responseReader.ReadToEnd(); + } + catch + { + throw; + } + finally + { + webRequest.GetResponse().GetResponseStream().Close(); + responseReader.Close(); + responseReader = null; + } + + return responseData; + } + } +}