void SignerV4::sign()

in sdk/src/signer/SignerV4.cc [280:331]


void SignerV4::sign(const std::shared_ptr<HttpRequest> &httpRequest, ParameterCollection &parameters,
    SignerParam &signerParam)const
{
    if (!signerParam.Cred().SessionToken().empty()) {
        httpRequest->addHeader("x-oss-security-token", signerParam.Cred().SessionToken());
    }

    auto requestTime = signerParam.RequestTime();
    auto datetime = FormatUnixTime(requestTime, "%Y%m%dT%H%M%SZ");
    auto date = FormatUnixTime(requestTime, "%Y%m%d");

    httpRequest->addHeader(Http::DATE, ToGmtTime(requestTime));
    httpRequest->addHeader("x-oss-date", datetime);

    if (!httpRequest->hasHeader("x-oss-content-sha256")) {
        httpRequest->addHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
    }

    auto additionalHeaders = getCommonAdditionalHeaders(httpRequest->Headers(), signerParam.AdditionalHeaders());

    auto canonicalReuqest = buildCanonicalReuqest(httpRequest, parameters, signerParam, additionalHeaders);
    auto scope = date + "/" + signerParam.Region() + "/" + signerParam.Product() + "/aliyun_v4_request";
    auto stringToSign = buildStringToSign(datetime, scope, canonicalReuqest);
    auto signature = buildSignature(signerParam.Cred().AccessKeySecret(), date, signerParam.Region(), signerParam.Product(), stringToSign);

    std::stringstream authValue;
    authValue
        << "OSS4-HMAC-SHA256"
        << " Credential="
        << signerParam.Cred().AccessKeyId() << "/"
        << scope;
    if (!additionalHeaders.empty()) {
        authValue    
            << ",AdditionalHeaders="
            << toHeaderSetString(additionalHeaders);
    }
    authValue    
        << ",Signature="
        << signature;

    //std::cout << "canonicalReuqest:" << canonicalReuqest << std::endl;
    //std::cout << "scope:" << scope << std::endl;
    //std::cout << "stringToSign:" << stringToSign << std::endl;
    //std::cout << "signature:" << signature << std::endl;
    //std::cout << "AUTHORIZATION:" << authValue.str() << std::endl;

    httpRequest->addHeader(Http::AUTHORIZATION, authValue.str());

    OSS_LOG(LogLevel::LogDebug, TAG, "request(%p) CanonicalReuqest:%s", httpRequest.get(), canonicalReuqest.c_str());
    OSS_LOG(LogLevel::LogDebug, TAG, "request(%p) StringToSign:%s", httpRequest.get(), stringToSign.c_str());
    OSS_LOG(LogLevel::LogDebug, TAG, "request(%p) Authorization:%s", httpRequest.get(), authValue.str().c_str());
 }