/// <summary> /// Access protected resource with access token /// </summary> /// <param name="accessToken">Access token</param> /// <param name="urlString">URL string for accessing protected resource</param> /// <param name="method">HTTP method to access</param> /// <param name="authorizationRealm">realm for accessing protected resource</param> /// <param name="queryParameters">Query parameter to be sent</param> /// <param name="additionalParameters">Parameters added to Authorization header</param> /// <param name="createRequest" >Factory method to create request object</param> /// <returns>HttpWebResponse from protected resource</returns> public HttpWebResponse AccessProtectedResource( AccessToken accessToken, String urlString, String method, String authorizationRealm, Parameter[] queryParameters, Parameter[] additionalParameters, RequestFactoryMethod createRequest) { HttpWebRequest req = null; IAsyncResult result = BeginAccessProtectedResource(accessToken, urlString, method, authorizationRealm, queryParameters, additionalParameters, out req, null, null, createRequest ); return((HttpWebResponse)req.EndGetResponse(result)); }
/// <summary> /// Begins an asynchronous access to protected resource with access token /// </summary> /// <param name="accessToken">Access token</param> /// <param name="urlString">URL string for accessing protected resource</param> /// <param name="method">HTTP method to access</param> /// <param name="authorizationRealm">realm for accessing protected resource</param> /// <param name="queryParameters">Query parameter to be sent</param> /// <param name="additionalParameters">Parameters added to Authorization header</param> /// <param name="request">Request that starts asynchronous access </param> /// <param name="callback">callback to pass request object</param> /// <param name="state">state to pass request object </param> /// <param name="createRequest" >Factory method to create request object</param> /// <returns>An IAsyncResult that references the asynchronous request for a response. </returns> public IAsyncResult BeginAccessProtectedResource( AccessToken accessToken, String urlString, String method, String authorizationRealm, Parameter[] queryParameters, Parameter[] additionalParameters, out HttpWebRequest request, AsyncCallback callback, Object state, RequestFactoryMethod createRequest) { if (additionalParameters == null) { additionalParameters = new Parameter[0]; } if (!(method.Equals("GET") || method.Equals("POST"))) { throw new ArgumentException( "Method must be GET or POST" ); } Uri uri = new Uri(urlString); if (uri.Query.Length > 0) { throw new ArgumentException( "Query parameter must not be passed included in url.\r\n" + "Pass them via queryParameters parameter of this method." ); } if (queryParameters == null) { queryParameters = new Parameter[0]; } String oauth_consumer_key = _consumerKey; String oauth_token = accessToken.TokenValue; String oauth_signature_method = "HMAC-SHA1"; String oauth_timestamp = ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / (1000 * 10000)).ToString(); String oauth_nonce = Guid.NewGuid().ToString(); request = createRequest( urlString + ( method.Equals("GET") && queryParameters.Length > 0 ? "?" + Parameter.ConCat(queryParameters) : "" ) ); if (_webProxy != null) { request.Proxy = _webProxy; } //Twitter service does not accept expect100continue request.ServicePoint.Expect100Continue = false; request.Method = method; String oauth_signature = CreateHMACSHA1Signature( request.Method, urlString, Parameter.ConCatAsArray( new Parameter[] { new Parameter("oauth_consumer_key", oauth_consumer_key), new Parameter("oauth_token", oauth_token), new Parameter("oauth_signature_method", oauth_signature_method), new Parameter("oauth_timestamp", oauth_timestamp), new Parameter("oauth_nonce", oauth_nonce) }, additionalParameters, queryParameters ), _consumerSecret, accessToken.TokenSecret ); request.Headers.Add( "Authorization: OAuth " + "realm=\"" + authorizationRealm + "\"," + "oauth_consumer_key=\"" + Parameter.EncodeParameterString(oauth_consumer_key) + "\"," + "oauth_token=\"" + Parameter.EncodeParameterString(oauth_token) + "\"," + "oauth_signature_method=\"" + Parameter.EncodeParameterString(oauth_signature_method) + "\"," + "oauth_signature=\"" + Parameter.EncodeParameterString(oauth_signature) + "\"," + "oauth_timestamp=\"" + Parameter.EncodeParameterString(oauth_timestamp) + "\"," + "oauth_nonce=\"" + Parameter.EncodeParameterString(oauth_nonce) + "\"" + (additionalParameters.Length > 0 ? "," + Parameter.ConCat(additionalParameters, "\"") : "" ) ); if (method.Equals("POST")) { String contents = Parameter.ConCat(queryParameters); request.ContentLength = contents.Length; Stream s = null; StreamWriter sw = null; try { s = request.GetRequestStream(); sw = new StreamWriter(s, Encoding.ASCII); sw.Write(contents); sw.Flush(); } finally { if (sw != null) { sw.Close(); } if (s != null) { s.Close(); } } } return(request.BeginGetResponse(callback, state)); }
/// <summary> /// Request access token responding to authenticated request token. /// </summary> /// <param name="verifier">Verifier string for authenticaed request token</param> /// <param name="requestToken">Authenticated request token</param> /// <param name="accessTokenUrl">Access token URL</param> /// <param name="realm">Realm for requesting access token</param> /// <param name="additionalParameters">Parameters added to Authorization header</param> /// <param name="responseParameters" >Parameters returned in response</param> /// <param name="createRequest" >Factory method to create request object</param> /// <returns>Responding access token</returns> public AccessToken RequestAccessToken( String verifier, RequestToken requestToken, String accessTokenUrl, String realm, Parameter[] additionalParameters, ref Parameter [] responseParameters, RequestFactoryMethod createRequest) { if (additionalParameters == null) { additionalParameters = new Parameter[0]; } String oauth_consumer_key = _consumerKey; String oauth_token = requestToken.TokenValue; String oauth_signature_method = "HMAC-SHA1"; String oauth_timestamp = ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / (1000 * 10000)).ToString(); String oauth_nonce = Guid.NewGuid().ToString(); HttpWebRequest req = createRequest(accessTokenUrl); if (_webProxy != null) { req.Proxy = _webProxy; } req.Method = "POST"; String oauth_signature = CreateHMACSHA1Signature( req.Method, accessTokenUrl, Parameter.ConCatAsArray( new Parameter[] { new Parameter("oauth_consumer_key", oauth_consumer_key), new Parameter("oauth_token", oauth_token), new Parameter("oauth_signature_method", oauth_signature_method), new Parameter("oauth_timestamp", oauth_timestamp), new Parameter("oauth_nonce", oauth_nonce), new Parameter("oauth_verifier", verifier), }, additionalParameters ), _consumerSecret, requestToken.TokenSecret ); req.Headers.Add( "Authorization: OAuth " + "realm=\"" + realm + "\"," + "oauth_consumer_key=\"" + Parameter.EncodeParameterString(oauth_consumer_key) + "\"," + "oauth_token=\"" + Parameter.EncodeParameterString(oauth_token) + "\"," + "oauth_signature_method=\"" + Parameter.EncodeParameterString(oauth_signature_method) + "\"," + "oauth_signature=\"" + Parameter.EncodeParameterString(oauth_signature) + "\"," + "oauth_timestamp=\"" + Parameter.EncodeParameterString(oauth_timestamp) + "\"," + "oauth_nonce=\"" + Parameter.EncodeParameterString(oauth_nonce) + "\"," + "oauth_verifier=\"" + Parameter.EncodeParameterString(verifier) + "\"" + (additionalParameters.Length > 0 ? "," + Parameter.ConCat(additionalParameters, "\"") : "" ) ); HttpWebResponse resp = null; try { resp = (HttpWebResponse)req.GetResponse(); StreamReader sr = new StreamReader(resp.GetResponseStream()); responseParameters = Parameter.Parse(sr.ReadToEnd()); String accessToken = null; String accessTokenSecret = null; foreach (Parameter param in responseParameters) { if (param.Name == "oauth_token") { accessToken = param.Value; } if (param.Name == "oauth_token_secret") { accessTokenSecret = param.Value; } } if (accessToken == null || accessTokenSecret == null) { throw new InvalidOperationException(); } return(new AccessToken(accessToken, accessTokenSecret)); } finally { if (resp != null) { resp.Close(); } } }