/// <summary> /// get signer /// </summary> /// <param name="jDCloudSignVersionType"></param> /// <returns></returns> public static IJDCloudSigner GetJDCloudSigner(JDCloudSignVersionType jDCloudSignVersionType) { switch (jDCloudSignVersionType) { case JDCloudSignVersionType.JDCloud_V2: return(new JDCloudSigner()); case JDCloudSignVersionType.JDCloud_V3: return(new JDCloudSignerV3()); default: return(new JDCloudSignerV3()); } }
/// <summary> /// 扩展签名方法 /// </summary> /// <param name="httpClient">当前请求客户端</param> /// <param name="credentials">认证参数信息</param> /// <param name="serviceName">the current request service name</param> /// <param name="overrideDate">the sign date override</param> /// <param name="signType">the jdcloud sign method type</param> /// <returns></returns> public static HttpClientWrapper DoSign(this HttpClient httpClient, Credentials credentials, string serviceName = null, JDCloudSignVersionType signType = JDCloudSignVersionType.JDCloud_V2, DateTime?overrideDate = null) { HttpClientWrapper httpClientWrapper = new HttpClientWrapper(httpClient, credentials, serviceName, signType, overrideDate); return(httpClientWrapper); }
/// <summary> /// 扩展签名方法 /// </summary> /// <param name="httpWebRequest">当前请求客户端</param> /// <param name="credentials">认证参数信息</param> /// <param name="bodyContent"></param> /// <param name="serviceName"></param> /// <param name="signType"></param> /// <param name="overrideDate"></param> /// <param name="isWriteBody"></param> /// <returns></returns> public static HttpWebRequest DoSign(this HttpWebRequest httpWebRequest, Credential credentials, string serviceName = null, object bodyContent = null, bool isWriteBody = false, JDCloudSignVersionType?signType = null, DateTime?overrideDate = null) { var byteContent = new byte[0]; if (bodyContent != null) { if (isWriteBody) { if (bodyContent is byte[]) { byteContent = (byte[])bodyContent; } else if (bodyContent is string) { byteContent = System.Text.Encoding.UTF8.GetBytes((string)bodyContent); // httpWebRequest.ContentLength = byteContent.Length; // httpRequestWrite.Write(byteContent, 0, byteContent.Length); } else if (bodyContent is int || bodyContent is long || bodyContent is bool || bodyContent is float || bodyContent is double) { if (bodyContent is int) { byteContent = BitConverter.GetBytes((int)bodyContent); } else if (bodyContent is long) { byteContent = BitConverter.GetBytes((long)bodyContent); } else if (bodyContent is bool) { byteContent = BitConverter.GetBytes((bool)bodyContent); } else if (bodyContent is float) { byteContent = BitConverter.GetBytes((float)bodyContent); } else if (bodyContent is double) { byteContent = BitConverter.GetBytes((double)bodyContent); } } else { var requestJson = JsonConvert.SerializeObject(bodyContent); if (!requestJson.IsNullOrWhiteSpace()) { byteContent = System.Text.Encoding.UTF8.GetBytes((string)bodyContent); } } } } var headers = httpWebRequest.Headers; var requestUri = httpWebRequest.RequestUri; var queryString = requestUri.Query; var requestPath = requestUri.AbsolutePath; var requestContent = bodyContent; var requestMethod = httpWebRequest.Method; string apiVersion = requestUri.GetRequestVersion(); RequestModel requestModel = new RequestModel(); requestModel.Content = (byte[])byteContent.Clone(); requestModel.ApiVersion = apiVersion; if (!httpWebRequest.ContentType.IsNullOrWhiteSpace()) { requestModel.ContentType = httpWebRequest.ContentType.ToString(); } requestModel.HttpMethod = requestMethod.ToString().ToUpper(); var pathRegion = requestUri.GetRequestRegion(); if (!pathRegion.IsNullOrWhiteSpace()) { requestModel.RegionName = pathRegion; } else { requestModel.RegionName = ParameterConstant.DEFAULT_REGION; } requestModel.ResourcePath = requestPath; if (!serviceName.IsNullOrWhiteSpace()) { requestModel.ServiceName = serviceName; } else { serviceName = requestUri.GetServiceName(); if (serviceName.IsNullOrWhiteSpace()) { throw new Exception("service name not config , if you not use default endpoint please config service in sign"); } requestModel.ServiceName = serviceName; } JDCloudSignVersionType jDCloudSignVersionType = GlobalConfig.GetInstance().SignVersionType; if (signType != null && signType.HasValue) { jDCloudSignVersionType = signType.Value; } requestModel.SignType = jDCloudSignVersionType; requestModel.Uri = requestUri; requestModel.QueryParameters = queryString; requestModel.OverrddenDate = overrideDate; if (!(requestUri.Scheme.ToLower() == "http" && requestUri.Port == 80) && !(requestUri.Scheme.ToLower() == "https" && requestUri.Port == 443)) { requestModel.RequestPort = requestUri.Port; } foreach (string headerKeyValue in headers.Keys) { requestModel.AddHeader(headerKeyValue, headers.Get(headerKeyValue)); } IJDCloudSigner jDCloudSigner = SignUtil.GetJDCloudSigner(jDCloudSignVersionType); SignedRequestModel signedRequestModel = jDCloudSigner.Sign(requestModel, credentials); var signedHeader = signedRequestModel.RequestHead; foreach (var key in signedHeader.Keys) { if (httpWebRequest.Headers.GetValues(key) == null) { var value = signedHeader[key]; httpWebRequest.Headers.Add(key, value); } } if (byteContent.Length > 0) { httpWebRequest.ContentLength = byteContent.Length; using (var httpRequestWrite = httpWebRequest.GetRequestStream()) { httpRequestWrite.Write(byteContent, 0, byteContent.Length); } } return(httpWebRequest); }
/// <summary> /// do sign http request message /// </summary> /// <param name="httpRequestMessage">the http request</param> /// <param name="credentials">the jdcloud credentials</param> /// <param name="overWriteDate">over write sign data</param> /// <param name="signType">the signType now support HMACSHA256</param> /// <param name="serviceName">the current http request request serviceName</param> /// <returns></returns> public static HttpRequestMessage DoRequestMessageSign(this HttpRequestMessage httpRequestMessage, Credential credentials, string serviceName = null, DateTime?overWriteDate = null, JDCloudSignVersionType?signType = null) { var headers = httpRequestMessage.Headers; var requestUri = httpRequestMessage.RequestUri; var queryString = requestUri.Query; var requestPath = requestUri.AbsolutePath; var requestContent = httpRequestMessage.Content; var requestMethod = httpRequestMessage.Method; string apiVersion = requestUri.GetRequestVersion(); RequestModel requestModel = new RequestModel(); requestModel.ApiVersion = apiVersion; if (requestContent != null) { using (var contentStream = new MemoryStream()) { requestContent.CopyToAsync(contentStream).Wait(); if (contentStream.Length > 0) { requestModel.Content = contentStream.ToArray(); } } requestModel.ContentType = requestContent.Headers.ContentType.ToString(); } requestModel.HttpMethod = requestMethod.ToString().ToUpper(); var pathRegion = requestUri.GetRequestRegion(); if (!string.IsNullOrWhiteSpace(pathRegion)) { requestModel.RegionName = pathRegion; } else { requestModel.RegionName = ParameterConstant.DEFAULT_REGION; } requestModel.ResourcePath = requestPath; if (!string.IsNullOrWhiteSpace(serviceName)) { requestModel.ServiceName = serviceName; } else { serviceName = requestUri.GetServiceName(); if (string.IsNullOrWhiteSpace(serviceName)) { throw new Exception("service name not config , if you not use default endpoint please config service in sign"); } requestModel.ServiceName = serviceName; } JDCloudSignVersionType jDCloudSignVersionType = GlobalConfig.GetInstance().SignVersionType; if (signType != null && signType.HasValue) { jDCloudSignVersionType = signType.Value; } requestModel.SignType = jDCloudSignVersionType; requestModel.Uri = requestUri; requestModel.QueryParameters = queryString; requestModel.OverrddenDate = overWriteDate; if (!(requestUri.Scheme.ToLower() == "http" && requestUri.Port == 80) && !(requestUri.Scheme.ToLower() == "https" && requestUri.Port == 443)) { requestModel.RequestPort = requestUri.Port; } foreach (var headerKeyValue in headers) { requestModel.AddHeader(headerKeyValue.Key, string.Join(",", headerKeyValue.Value)); } IJDCloudSigner jDCloudSigner = SignUtil.GetJDCloudSigner(jDCloudSignVersionType); SignedRequestModel signedRequestModel = jDCloudSigner.Sign(requestModel, credentials); var signedHeader = signedRequestModel.RequestHead; foreach (var key in signedHeader.Keys) { if (!httpRequestMessage.Headers.Contains(key)) { var value = signedHeader[key]; httpRequestMessage.Headers.TryAddWithoutValidation(key, value); } } return(httpRequestMessage); }