in src/AlibabaCloud.OSS.V2/Signer/SignerV4.cs [34:102]
private static void AuthQuery(SigningContext signingContext)
{
var request = signingContext.Request;
var credentials = signingContext.Credentials;
var region = signingContext.Region ?? "";
var product = signingContext.Product ?? "";
// Date
var signTime = signingContext.SignTime ?? DateTime.UtcNow;
var datetime = FormatDateTime(signTime);
var date = FormatDate(signTime);
// Expiration
var expiration = signingContext.Expiration ?? DateTime.UtcNow.AddMinutes(15);
var expires = ((long)expiration.Subtract(signTime).TotalSeconds).ToString(CultureInfo.InvariantCulture);
// Scope
var scope = $"{date}/{region}/{product}/aliyun_v4_request";
// Headers
var headers = request!.Headers;
var additionalHeaders = GetAdditionalHeaders(headers, signingContext.AdditionalHeaders);
additionalHeaders.Sort();
// Credentials information
var parameters = new Dictionary<string, string>();
if (credentials!.SecurityToken.IsNotEmpty()) parameters.Add("x-oss-security-token", credentials.SecurityToken);
parameters.Add("x-oss-signature-version", "OSS4-HMAC-SHA256");
parameters.Add("x-oss-date", datetime);
parameters.Add("x-oss-expires", expires);
parameters.Add("x-oss-credential", $"{credentials.AccessKeyId}/{scope}");
if (additionalHeaders.Count > 0)
parameters.Add("x-oss-additional-headers", additionalHeaders.JoinToString(";"));
// update query
var queryStr = parameters
.Select(
x => x.Value.IsEmpty() ? x.Key.UrlEncode() : x.Key.UrlEncode() + "=" + x.Value.UrlEncode()
)
.JoinToString("&");
request.RequestUri = request.RequestUri.AppendToQuery(queryStr);
// CanonicalRequest
var canonicalRequest = CanonicalizeRequest(
request,
ResourcePath(signingContext.Bucket, signingContext.Key),
headers,
additionalHeaders
);
// StringToSign
var stringToSign = CalcStringToSign(datetime, scope, canonicalRequest);
// Signature
var signature = CalcSignature(credentials.AccessKeySecret, date, region, product, stringToSign);
// Credential
request.RequestUri = request.RequestUri.AppendToQuery($"x-oss-signature={signature.UrlEncode()}");
//Console.WriteLine("canonicalRequest:{0}\n", canonicalRequest);
//Console.WriteLine("stringToSign:{0}\n", stringToSign);
//Console.WriteLine("signature:{0}\n", signature);
//update
signingContext.Request = request;
signingContext.Expiration = expiration;
signingContext.StringToSign = stringToSign;
}