/// <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); }
/// <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); } }