Exemplo n.º 1
0
        /// <summary>
        ///     Registra una nueva cuenta en la Nube de KMS.
        /// </summary>
        /// <param name="accountData">
        ///     Información de la cuenta a registrar.
        /// </param>
        public OAuthCryptoSet RegisterAccount(Dictionary <string, string> accountData)
        {
            Token = null;
            GetRequestToken();

            var parameters = new NameValueCollection();

            parameters.AddFromDictionary(accountData);

            var response = RequestSimpleNameValue(
                HttpRequestMethod.POST,
                ((KMSCloudUris)ClientUris).KmsRegisterAccountResource,
                parameters,
                null,
                new Dictionary <HttpRequestHeader, string> {
                {
                    HttpRequestHeader.AcceptLanguage, CultureInfo.CurrentCulture.Name
                }
            });

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new OAuthUnexpectedResponse <NameValueCollection>(response);
            }

            var tokenSet = new OAuthCryptoSet(
                response.Response.Get("oauth_token"),
                response.Response.Get("oauth_token_secret"));

            if (string.IsNullOrEmpty(tokenSet.Key) || string.IsNullOrEmpty(tokenSet.Secret))
            {
                throw new OAuthUnexpectedResponse <NameValueCollection>(
                          response,
                          "Server responded OK but no OAuth Credentials received.");
            }

            Token = tokenSet;
            return(tokenSet);
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Realiza una nueva petición OAuth al recurso especificado, y devuleve el objeto HttpWebResponse
        ///     generado por la petición.
        /// </summary>
        /// <param name="requestMethod">
        ///     Método de Petición HTTP.
        /// </param>
        /// <param name="resource">
        ///     Recurso HTTP al que llamar (parte del URI después del dominio).
        /// </param>
        /// <param name="parameters">
        ///     Parámetros a enviar en la petición
        /// </param>
        /// <param name="oAuthExtraParameters">
        ///     Parámetros extra a añadir en la cabecera Authorization de OAuth.
        /// </param>
        /// <param name="requestHeaders">
        ///     Cabeceras HTTP a añadir a la petición.
        /// </param>
        /// <returns>
        ///     Devuelve la respuesta recibida del API.
        /// </returns>
        public HttpWebResponse Request(
            HttpRequestMethod requestMethod,
            string resource,
            NameValueCollection parameters = null,
            Dictionary <string, string> oAuthExtraParameters      = null,
            Dictionary <HttpRequestHeader, string> requestHeaders = null)
        {
            // -- Validar que se tengan API-Key --
            if (ConsumerCredentials == null)
            {
                throw new OAuthConsumerKeySetInvalid();
            }

            // -- Crear URI de Petición --
            var requestUri = new Uri(ClientUris.BaseUri, resource);

            // -- Generar valores de cabecera OAuth --
            // Calcular Timestamp UNIX (segundos desde 1970-01-01 00:00:00)
            TimeSpan timestamp = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);

            // Calcular Nonce
            var nonceBytes = new byte[16];

            (new Random()).NextBytes(nonceBytes);

            string nonce = Convert.ToBase64String(nonceBytes);

            // Generar valores de cabecera Authorization: OAuth
            var oAuthParameters = new NameValueCollection();

            if (oAuthExtraParameters != null)
            {
                oAuthParameters.AddFromDictionary(oAuthExtraParameters);
            }

            oAuthParameters.Add(
                new NameValueCollection {
                {
                    "oauth_consumer_key", ConsumerCredentials.Key
                }, {
                    "oauth_nonce", nonce
                }, {
                    "oauth_signature_method", SignatureMethod
                }, {
                    "oauth_timestamp", ((int)timestamp.TotalSeconds).ToString()
                }, {
                    "oauth_version", Version
                }
            });

            if (Token != null && Token.Key != null)
            {
                oAuthParameters.Add("oauth_token", Token.Key);
            }

            // -- Generar base para Firma de Petición --
            var oAuthSignatureBaseParameters = new NameValueCollection {
                oAuthParameters
            };

            if (parameters != null)
            {
                oAuthSignatureBaseParameters.Add(parameters);
            }

            // -- Añadir Firma de Petición a cabecera Authorization: OAuth
            oAuthParameters.Add(
                "oauth_signature",
                GetSignature(requestMethod, requestUri, oAuthSignatureBaseParameters));

            // -- Generar HttpWebRequest --
            // Generar cuerpo de petición
            var requestStringBuilder = new StringBuilder();

            if (parameters == null)
            {
                parameters = new NameValueCollection();
            }

            foreach (string key in parameters.AllKeys)
            {
                var values = parameters.GetValues(key);
                if (values == null)
                {
                    continue;
                }

                foreach (string value in values)
                {
                    requestStringBuilder.Append(
                        string.Format("{0}={1}&", Uri.EscapeDataString(key), Uri.EscapeDataString(value)));
                }
            }

            var requestString = "";

            if (requestStringBuilder.Length > 0)
            {
                requestString = requestStringBuilder.ToString().Remove(requestStringBuilder.Length - 1);
            }

            // Preparar objeto de Petición Web
            if (requestMethod == HttpRequestMethod.GET && requestString.Length > 0)
            {
                requestUri =
                    new Uri(
                        string.Format(
                            "{0}{1}{2}",
                            requestUri.AbsoluteUri,
                            requestUri.AbsoluteUri.IndexOf('?') > -1 ? "&" : "?",
                            requestString));
            }

            var request = (HttpWebRequest)WebRequest.Create(requestUri);

            request.Method = requestMethod.ToString();

            if (requestHeaders != null)
            {
                foreach (var item in requestHeaders)
                {
                    switch (item.Key)
                    {
                    case HttpRequestHeader.Accept:
                        request.Accept = item.Value;
                        break;

                    case HttpRequestHeader.IfModifiedSince:
                        request.IfModifiedSince = DateTime.Parse(item.Value);
                        break;

                    default:
                        request.Headers.Add(item.Key, item.Value);
                        break;
                    }
                }
            }

            // Añadir cabecera Authorization: OAuth
            var oAuthHeaderString = new StringBuilder("OAuth ");

            foreach (string key in oAuthParameters.AllKeys)
            {
                var values = oAuthParameters.GetValues(key);
                if (values == null)
                {
                    continue;
                }

                foreach (string value in values)
                {
                    oAuthHeaderString.AppendFormat("{0}=\"{1}\", ", key, Uri.EscapeDataString(value));
                }
            }

            request.Headers.Add(
                HttpRequestHeader.Authorization,
                oAuthHeaderString.ToString().Remove(oAuthHeaderString.Length - 2));

            if (requestMethod != HttpRequestMethod.GET)
            {
                byte[] requestBodyBytes = Encoding.UTF8.GetBytes(requestString);

                request.ContentType   = "application/x-www-form-urlencoded; charset=utf-8";
                request.ContentLength = requestBodyBytes.Length;

                Stream requestBodyStream = request.GetRequestStream();

                requestBodyStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
                requestBodyStream.Flush();
            }

            // -- Solicitar y devolver respuesta de API --
            try {
                return(request.GetResponse() as HttpWebResponse);
            } catch (WebException ex) {
                var response = ex.Response as HttpWebResponse;

                if (response == null)
                {
                    throw new OAuthUnexpectedResponse(ex);
                }

                if (response.StatusCode != HttpStatusCode.Unauthorized)
                {
                    return(response);
                }

                Token = null;
                CurrentlyHasAccessToken = false;

                if (response.Headers[HttpResponseHeader.Warning] == null)
                {
                    throw new OAuthUnauthorized(response.StatusDescription, ex);
                }

                throw new OAuthUnauthorized(response.Headers[HttpResponseHeader.Warning], ex);
            }
        }