Mercurial > altnet-hispano
diff Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs @ 100:cc91817a4206
Merge
author | jorge.rowies |
---|---|
date | Sat, 04 Jun 2011 22:46:06 -0300 |
parents | db4b1e2cae49 |
children | 1ee5711256db |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs Sat Jun 04 22:46:06 2011 -0300 @@ -0,0 +1,257 @@ +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 = ""; + + private string ConsumerKey + { + get + { + if (_consumerKey.Length == 0) + { + _consumerKey = ConfigurationManager.AppSettings["consumerKey"]; + } + return _consumerKey; + } + } + + private string ConsumerSecret { + get { + if (_consumerSecret.Length == 0) + { + _consumerSecret = ConfigurationManager.AppSettings["consumerSecret"]; + } + return _consumerSecret; + } + } + + 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; } } + + /// <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[OAuthTokenKey] != null) + { + ret = AUTHORIZE + "?" + OAuthTokenKey + "=" + qs[OAuthTokenKey]; + } + } + 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) + { + Token = authToken; + 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[OAuthTokenKey] != null) + { + Token = qs[OAuthTokenKey]; + } + if (qs[OAuthTokenSecretKey] != null) + { + TokenSecret = qs[OAuthTokenSecretKey]; + } + } + } + + /// <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] = UrlEncode(qs[key]); + postData += key + "=" + qs[key]; + + } + if (url.IndexOf("?") > 0) + { + url += "&"; + } + else + { + url += "?"; + } + url += postData; + } + } + + var uri = new Uri(url); + + string nonce = GenerateNonce(); + string timeStamp = GenerateTimeStamp(); + + //Generate Signature + string sig = GenerateSignature(uri, + ConsumerKey, + ConsumerSecret, + Token, + TokenSecret, + CallBackUrl, + OAuthVerifier, + method.ToString(), + timeStamp, + nonce, + out outUrl, + out querystring); + + querystring += "&" + OAuthSignatureKey + "=" + 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; + StreamWriter requestWriter; + 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); + } + finally + { + requestWriter.Close(); + } + } + + responseData = WebResponseGet(webRequest); + + 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(); + } + finally + { + webRequest.GetResponse().GetResponseStream().Close(); + responseReader.Close(); + } + + return responseData; + } + } +}