private string GetAuthenticationHeaderForRequest(Uri requestUri, HttpMethod method, Dictionary <String, String> postvars)
        {
            List <KeyValuePair <string, string> > parameters = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>(Constants.oauth_consumer_key, _apiKey),
                new KeyValuePair <string, string>(Constants.oauth_nonce, OAuthHelpers.GenerateNonce()),
                new KeyValuePair <string, string>(Constants.oauth_timestamp, OAuthHelpers.GenerateTimestamp()),
                new KeyValuePair <string, string>(Constants.oauth_signature_method, "HMAC-SHA1"),
                new KeyValuePair <string, string>(Constants.oauth_version, Constants.oauth_version_1a),
                new KeyValuePair <string, string>(Constants.oauth_token, _authToken),
            };

            if (postvars != null)
            {
                foreach (var item in postvars)
                {
                    parameters.Add(new KeyValuePair <string, string>(item.Key, item.Value));
                }
                // reset parameters for future calls
                _parameters = null;
            }

            string baseUri = requestUri.OriginalString;

            // We need to handle the case where the request comes with query parameters
            if (!string.IsNullOrEmpty(requestUri.Query))
            {
                baseUri = requestUri.OriginalString.Replace(requestUri.Query, "");

                foreach (var param in requestUri.Query.Split(new char[] { '?', '&' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var    values = param.Split('=');
                    string name   = values[0];
                    string value  = string.Empty;
                    if (values.Length > 1)
                    {
                        value = values[1];
                    }

                    parameters.Add(new KeyValuePair <string, string>(Uri.UnescapeDataString(name), Uri.UnescapeDataString(value)));
                }
            }

            string baseString = OAuthHelpers.GenerateBaseString(baseUri, method.ToString(), parameters);
            string sig        = OAuthHelpers.EncodeValue(OAuthHelpers.GenerateHMACDigest(baseString, _secret, _authTokenSecret));

            parameters.Add(new KeyValuePair <string, string>(Constants.oauth_signature, sig));

            StringBuilder sb = new StringBuilder();

            foreach (var param in parameters)
            {
                if (param.Key.StartsWith("oauth"))
                {
                    sb.AppendFormat("{0}={1},", param.Key, System.Net.WebUtility.HtmlEncode(param.Value));
                }
            }
            sb.Remove(sb.Length - 1, 1);
            return(sb.ToString());
        }
        private string CreateRequest(string url, string method, string tokSecret, params object[] args)
        {
            SortedSet <KeyValuePair <string, string> > parameters = new SortedSet <KeyValuePair <string, string> >(new OAuthParameterComparer())
            {
                new KeyValuePair <string, string>(Constants.oauth_consumer_key, _apiKey),
                new KeyValuePair <string, string>(Constants.oauth_nonce, OAuthHelpers.GenerateNonce()),
                new KeyValuePair <string, string>(Constants.oauth_timestamp, OAuthHelpers.GenerateTimestamp()),
                new KeyValuePair <string, string>(Constants.oauth_signature_method, "HMAC-SHA1"),
            };

            if (!string.IsNullOrEmpty(_oauthVersion))
            {
                parameters.Add(new KeyValuePair <string, string>(Constants.oauth_version, _oauthVersion));
            }

            for (int i = 0; i < args.Length; i += 2)
            {
                parameters.Add(new KeyValuePair <string, string>(args[i].ToString(), args[i + 1].ToString()));
            }

            string baseString = OAuthHelpers.GenerateBaseString(url, method, parameters);
            string sig        = OAuthHelpers.EncodeValue(OAuthHelpers.GenerateHMACDigest(baseString, OAuthHelpers.CreateHashKeyBytes(_secret, tokSecret)));

            parameters.Add(new KeyValuePair <string, string>(Constants.oauth_signature, sig));

            StringBuilder sb = new StringBuilder();

            foreach (var param in parameters)
            {
                sb.AppendFormat("{0}={1}&", param.Key, System.Net.WebUtility.HtmlEncode(param.Value));
            }
            sb.Remove(sb.Length - 1, 1);
            return(sb.ToString());
        }
Example #3
0
        public OAuthMessageHandler(string apiKey, string secret, string authToken, string authTokenSecret, IOAuthSignatureData provider)
        {
            _apiKey                = apiKey;
            _secret                = secret;
            _authToken             = authToken;
            _authTokenSecret       = authTokenSecret;
            _signatureDataProvider = provider;

            _hmacSha1Param  = new KeyValuePair <string, string>(Constants.oauth_signature_method, "HMAC-SHA1");
            _apiKeyParam    = new KeyValuePair <string, string>(Constants.oauth_consumer_key, _apiKey);
            _authTokenParam = new KeyValuePair <string, string>(Constants.oauth_token, _authToken);

            // Construct the OAuthVersion parameter based on the requested version.
            _oauthVersionParam = new KeyValuePair <string, string>(Constants.oauth_version, _signatureDataProvider.GetOAuthVersion());
            _keyBytes          = OAuthHelpers.CreateHashKeyBytes(_secret, _authTokenSecret);

            this.InnerHandler = new HttpClientHandler();
        }
 public OAuthAuthenticator(string apiKey, string secret, OAuthVersion oauthVersion)
 {
     _apiKey       = apiKey;
     _secret       = secret;
     _oauthVersion = OAuthHelpers.GetOAuthVersionAsString(oauthVersion);
 }
        private async Task <string> GetAuthenticationHeaderForRequest(HttpRequestMessage request)
        {
            Uri        requestUri = request.RequestUri;
            HttpMethod method     = request.Method;

            List <KeyValuePair <string, string> > parameters = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>(Constants.oauth_consumer_key, _apiKey),
                new KeyValuePair <string, string>(Constants.oauth_nonce, OAuthHelpers.GenerateNonce()),
                new KeyValuePair <string, string>(Constants.oauth_timestamp, OAuthHelpers.GenerateTimestamp()),
                new KeyValuePair <string, string>(Constants.oauth_signature_method, "HMAC-SHA1"),
                new KeyValuePair <string, string>(Constants.oauth_version, Constants.oauth_version_1a),
                new KeyValuePair <string, string>(Constants.oauth_token, _authToken),
            };

            string baseUri = requestUri.OriginalString;

            // We need to handle the case where the request comes with query parameters, in URL or in body
            string queryString = string.Empty;

            if (!string.IsNullOrEmpty(requestUri.Query))
            {
                baseUri     = requestUri.OriginalString.Replace(requestUri.Query, "");
                queryString = requestUri.Query;
            }

            if (request.Content.Headers.ContentType.MediaType == "application/x-www-form-urlencoded")
            {
                string requestContent = await request.Content.ReadAsStringAsync();

                queryString = $"{queryString}&{requestContent}";
            }

            foreach (var param in queryString.Split(new char[] { '?', '&' }, StringSplitOptions.RemoveEmptyEntries))
            {
                var    values = param.Split('=');
                string name   = Uri.UnescapeDataString(values[0]);
                name = name.Replace('+', ' ');
                string value = string.Empty;
                if (values.Length > 1)
                {
                    value = Uri.UnescapeDataString(values[1]);
                    value = value.Replace('+', ' ');
                }
                parameters.Add(new KeyValuePair <string, string>(name, value));
            }

            string baseString = OAuthHelpers.GenerateBaseString(baseUri, method.ToString(), parameters);
            string sig        = OAuthHelpers.EncodeValue(OAuthHelpers.GenerateHMACDigest(baseString, _secret, _authTokenSecret));

            parameters.Add(new KeyValuePair <string, string>(Constants.oauth_signature, sig));

            StringBuilder sb = new StringBuilder();

            foreach (var param in parameters)
            {
                if (param.Key.StartsWith("oauth"))
                {
                    sb.AppendFormat("{0}={1},", param.Key, System.Net.WebUtility.HtmlEncode(param.Value));
                }
            }
            sb.Remove(sb.Length - 1, 1);
            return(sb.ToString());
        }
Example #6
0
        private async Task <string> GetAuthenticationHeaderForRequest(HttpRequestMessage request)
        {
            SortedSet <KeyValuePair <string, string> > parameters = new SortedSet <KeyValuePair <string, string> >(new OAuthParameterComparer())
            {
                // Re-use the parameters that don't change
                _apiKeyParam,
                _hmacSha1Param,
                _authTokenParam,

                // Add the parameters that are unique for each call
                new KeyValuePair <string, string>(Constants.oauth_nonce, _signatureDataProvider.GetNonce()),
                new KeyValuePair <string, string>(Constants.oauth_timestamp, _signatureDataProvider.GetTimeStamp()),
            };

            // if we have specified the OAuthVersion, add it!
            if (!string.IsNullOrEmpty(_oauthVersionParam.Value))
            {
                parameters.Add(_oauthVersionParam);
            }

            Uri    requestUri = request.RequestUri;
            string baseUri    = requestUri.OriginalString;

            // We need to handle the case where the request comes with query parameters, in URL or in body
            string queryString = string.Empty;

            if (!string.IsNullOrEmpty(requestUri.Query))
            {
                baseUri     = requestUri.OriginalString.Replace(requestUri.Query, "");
                queryString = requestUri.Query;
            }

            // concatenate the content with the request content if the media type says we should.
            if (StringComparer.OrdinalIgnoreCase.Equals(request.Content?.Headers.ContentType?.MediaType, Constants.ContentType))
            {
                string requestContent = await request.Content.ReadAsStringAsync();

                if (string.IsNullOrEmpty(queryString))
                {
                    queryString = requestContent;
                }
                else
                {
                    queryString = $"{queryString}&{requestContent}";
                }
            }

            if (!string.IsNullOrEmpty(queryString))
            {
                ParseParameters(parameters, queryString);
            }

            string baseString = OAuthHelpers.GenerateBaseString(baseUri, request.Method.ToString(), parameters);
            string sig        = OAuthHelpers.EncodeValue(OAuthHelpers.GenerateHMACDigest(baseString, _keyBytes));

            parameters.Add(new KeyValuePair <string, string>(Constants.oauth_signature, sig));

            StringBuilder sb = new StringBuilder();

            foreach (var param in parameters)
            {
                if (param.Key.StartsWith("oauth"))
                {
                    sb.AppendFormat("{0}={1},", param.Key, System.Net.WebUtility.HtmlEncode(param.Value));
                }
            }
            sb.Remove(sb.Length - 1, 1);
            return(sb.ToString());
        }