コード例 #1
0
        private Dictionary <string, string> BuildHeaders(string contentType, string requestPayload, string canonicalQueryString)
        {
            string endpoint = this.Endpoint;

            if (!string.IsNullOrEmpty(this.Profile.HttpProfile.Endpoint))
            {
                endpoint = this.Profile.HttpProfile.Endpoint;
            }
            string httpRequestMethod    = this.Profile.HttpProfile.ReqMethod;
            string canonicalURI         = "/";
            string canonicalHeaders     = "content-type:" + contentType + "; charset=utf-8\nhost:" + endpoint + "\n";
            string signedHeaders        = "content-type;host";
            string hashedRequestPayload = SignHelper.SHA256Hex(requestPayload);
            string canonicalRequest     = httpRequestMethod + "\n"
                                          + canonicalURI + "\n"
                                          + canonicalQueryString + "\n"
                                          + canonicalHeaders + "\n"
                                          + signedHeaders + "\n"
                                          + hashedRequestPayload;

            string algorithm              = "TC3-HMAC-SHA256";
            long   timestamp              = ToTimestamp() / 1000;
            string requestTimestamp       = timestamp.ToString();
            string date                   = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(timestamp).ToString("yyyy-MM-dd");
            string service                = endpoint.Split('.')[0];
            string credentialScope        = date + "/" + service + "/" + "tc3_request";
            string hashedCanonicalRequest = SignHelper.SHA256Hex(canonicalRequest);
            string stringToSign           = algorithm + "\n"
                                            + requestTimestamp + "\n"
                                            + credentialScope + "\n"
                                            + hashedCanonicalRequest;

            byte[] tc3SecretKey   = Encoding.UTF8.GetBytes("TC3" + Credential.SecretKey);
            byte[] secretDate     = SignHelper.HmacSHA256(tc3SecretKey, Encoding.UTF8.GetBytes(date));
            byte[] secretService  = SignHelper.HmacSHA256(secretDate, Encoding.UTF8.GetBytes(service));
            byte[] secretSigning  = SignHelper.HmacSHA256(secretService, Encoding.UTF8.GetBytes("tc3_request"));
            byte[] signatureBytes = SignHelper.HmacSHA256(secretSigning, Encoding.UTF8.GetBytes(stringToSign));
            string signature      = BitConverter.ToString(signatureBytes).Replace("-", "").ToLower();

            string authorization = algorithm + " "
                                   + "Credential=" + Credential.SecretId + "/" + credentialScope + ", "
                                   + "SignedHeaders=" + signedHeaders + ", "
                                   + "Signature=" + signature;

            Dictionary <string, string> headers = new Dictionary <string, string>();

            headers.Add("Authorization", authorization);
            headers.Add("Host", endpoint);
            headers.Add("Content-Type", contentType);
            headers.Add("X-TC-Timestamp", requestTimestamp);
            headers.Add("X-TC-Version", this.ApiVersion);
            headers.Add("X-TC-Region", this.Region);
            headers.Add("X-TC-RequestClient", this.SdkVersion);
            if (!string.IsNullOrEmpty(this.Credential.Token))
            {
                headers.Add("X-TC-Token", this.Credential.Token);
            }
            return(headers);
        }
コード例 #2
0
        private async Task <IResponse> RequestV3(AbstractModel request, string actionName)
        {
            string endpoint = this.Endpoint;

            if (!string.IsNullOrEmpty(this.Profile.HttpProfile.Endpoint))
            {
                endpoint = this.Profile.HttpProfile.Endpoint;
            }
            string httpRequestMethod    = this.Profile.HttpProfile.ReqMethod;
            string canonicalURI         = "/";
            string canonicalQueryString = "";
            string requestPayload       = "";
            string contentType          = "application/x-www-form-urlencoded";

            if (HttpProfile.REQ_GET.Equals(httpRequestMethod))
            {
                Dictionary <string, string> param = new Dictionary <string, string>();
                request.ToMap(param, "");
                StringBuilder urlBuilder = new StringBuilder();
                foreach (KeyValuePair <string, string> kvp in param)
                {
                    urlBuilder.Append($"{WebUtility.UrlEncode(kvp.Key)}={WebUtility.UrlEncode(kvp.Value)}&");
                }
                canonicalQueryString = urlBuilder.ToString().TrimEnd('&');
            }
            else
            {
                requestPayload = JsonConvert.SerializeObject(request,
                                                             Newtonsoft.Json.Formatting.None,
                                                             new JsonSerializerSettings {
                    NullValueHandling = NullValueHandling.Ignore
                });
                contentType = "application/json";
            }
            // HttpContent->StringContent will add charset to utf-8 in content-type,
            // which leads to authentication failure in API...
            string canonicalHeaders     = "content-type:" + contentType + "; charset=utf-8\nhost:" + endpoint + "\n";
            string signedHeaders        = "content-type;host";
            string hashedRequestPayload = SignHelper.SHA256Hex(requestPayload);
            string canonicalRequest     = httpRequestMethod + "\n"
                                          + canonicalURI + "\n"
                                          + canonicalQueryString + "\n"
                                          + canonicalHeaders + "\n"
                                          + signedHeaders + "\n"
                                          + hashedRequestPayload;
            //Console.WriteLine(canonicalRequest);

            string algorithm              = "TC3-HMAC-SHA256";
            long   timestamp              = ToTimestamp() / 1000;
            string requestTimestamp       = timestamp.ToString();
            string date                   = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(timestamp).ToString("yyyy-MM-dd");
            string service                = endpoint.Split('.')[0];
            string credentialScope        = date + "/" + service + "/" + "tc3_request";
            string hashedCanonicalRequest = SignHelper.SHA256Hex(canonicalRequest);
            string stringToSign           = algorithm + "\n"
                                            + requestTimestamp + "\n"
                                            + credentialScope + "\n"
                                            + hashedCanonicalRequest;

            //Console.WriteLine(stringToSign);

            byte[] tc3SecretKey   = Encoding.UTF8.GetBytes("TC3" + Credential.SecretKey);
            byte[] secretDate     = SignHelper.HmacSHA256(tc3SecretKey, Encoding.UTF8.GetBytes(date));
            byte[] secretService  = SignHelper.HmacSHA256(secretDate, Encoding.UTF8.GetBytes(service));
            byte[] secretSigning  = SignHelper.HmacSHA256(secretService, Encoding.UTF8.GetBytes("tc3_request"));
            byte[] signatureBytes = SignHelper.HmacSHA256(secretSigning, Encoding.UTF8.GetBytes(stringToSign));
            string signature      = BitConverter.ToString(signatureBytes).Replace("-", "").ToLower();
            //Console.WriteLine(signature);

            string authorization = algorithm + " "
                                   + "Credential=" + Credential.SecretId + "/" + credentialScope + ", "
                                   + "SignedHeaders=" + signedHeaders + ", "
                                   + "Signature=" + signature;
            //Console.WriteLine(authorization);

            Dictionary <string, string> headers = new Dictionary <string, string>();

            headers.Add("Authorization", authorization);
            headers.Add("Host", endpoint);
            headers.Add("Content-Type", contentType);
            headers.Add("X-TC-Action", actionName);
            headers.Add("X-TC-Timestamp", requestTimestamp);
            headers.Add("X-TC-Version", this.ApiVersion);
            headers.Add("X-TC-Region", this.Region);
            headers.Add("X-TC-RequestClient", this.SdkVersion);
            if (!string.IsNullOrEmpty(this.Credential.Token))
            {
                headers.Add("X-TC-Token", this.Credential.Token);
            }

            HttpConnection conn = new HttpConnection(
                $"{this.Profile.HttpProfile.Protocol }{endpoint}",
                this.Profile.HttpProfile.Timeout,
                this.Profile.HttpProfile.WebProxy);

            try
            {
                if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET)
                {
                    return(await conn.GetRequest(this.Path, canonicalQueryString, headers));
                }
                else
                {
                    return(await conn.PostRequest(this.Path, requestPayload, headers));
                }
            }
            catch (Exception e)
            {
                throw new TencentCloudSDKException($"The request with exception: {e.Message}");
            }
        }